如何解决Java Spring RestController无法实现自定义接口
我对Spring完全陌生,受命创建一个通过使用Azure Active Directory对用户进行身份验证来启用SSO的应用程序。我有一个严格的规则,我需要使用一个接口(由供应商提供)来定义一种方法,如下所示:
public String authenticate(HttpServletRequest request);
将从我们供应商的软件中调用此方法,以对用户进行身份验证。返回的字符串必须是用户主体名称。我遵循了有关如何使用Spring Security合并Azure Active Directory的官方文档,并且能够在控制器中检索我的用户信息!我遇到的问题是当我实现供应商界面时该方法不再起作用并报告以下错误消息:
出现意外错误(类型=未找到,状态= 404)。
我已经在线进行了研究,可以在接口级别上添加注释并在控制器上实现它,但是我无法访问供应商接口,该接口只能通过外部JAR文件提供给我。我也看到了建议,您可以在其中更新application.properties文件并将以下参数设置为true,但这没有帮助:
spring.aop.proxy-target-class=true
任何帮助都会很棒,如果由于对生态系统不熟悉而错过任何重要细节,我深表歉意。下面是我的代码:
AuthController:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.access.prepost.PreAuthorize;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.generic.CustomerVendorInterface;
@RestController
public class AuthController implements CustomVendorInterface {
@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
@Override
public String authenticate(HttpServletRequest request) {
String username = null;
OAuth2User user = ((OAuth2AuthenticationToken)request.getUserPrincipal()).getPrincipal();
if (user != null)
username = user.getAttribute("upn");
return username;
}
}
WebSecurityConfig:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.client.oidc.userinfo.OidcUserRequest;
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
import org.springframework.security.oauth2.core.oidc.user.OidcUser;
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private OAuth2UserService<OidcUserRequest,OidcUser> oidcUserService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.oauth2Login()
.userInfoEndpoint()
.oidcUserService(oidcUserService);
}
}
解决方法
我建议将您的控制器和身份验证分为不同的类。这是实现function newWeek() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var lastCol = sheet.getLastColumn();
var rowCol = sheet.getLastRow();
var maxCols = sheet.getMaxColumns();
// Number of columns to duplicate//
var numCols = 15
//Selects the previous week//
var range = sheet.getRange(1,lastCol - 14,rowCol,15);
//Inserts columns for next week//
sheet.insertColumnsAfter(lastCol,numCols);
//Copies previous weeks properties into new columns//
range.copyTo(sheet.getRange(1,lastCol + 1,15));
}
的方法:
CustomVenderInterface
然后,您的控制器类将如下所示:
@Component
public class Authenticator implements CustomVenderInterface {
@Override
public String authenticate(HttpServletRequest request) {
String username = null;
OAuth2User user = ((OAuth2AuthenticationToken)request.getUserPrincipal()).getPrincipal();
if (user != null)
username = user.getAttribute("upn");
return username;
}
}
请说明如何将@RestController
public class AuthController {
private final Authenticator authenticator;
public AuthController(Authenticator authenticator) {
this.authenticator = authenticator;
}
@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String handleAuthRequest(HttpServletRequest request) {
return authenticator.authenticate(request);
}
}
传递到供应商的图书馆。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。