我正在使用Spring Boot。最终目标是创建一个简单的仪表板,以提供有关通过Tomcat部署的另一个Web应用程序的统计信息和示例。 API调用。您还可以使用API通过SOAP进行身份验证,这是我目前想通过HTTPS执行的操作。我一直在寻找Spring Security这样的指南:https://www.baeldung.com/spring-security-authentication-provider
我的主要问题是:Spring Security是否适合我想要做的事情?根据上面的链接,我有以下代码:
@Component
public class CustomAuthenticationProvider
implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String name = authentication.getName();
String password = authentication.getCredentials().toString();
try {
ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
a.authenticate(name, password);
//authentication successful return token
return new UsernamePasswordAuthenticationToken(
name, password, new ArrayList<>());
} catch(ApiAuthenticationException e) {
//Authentication failed return null
return null;
}
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(
UsernamePasswordAuthenticationToken.class);
}
}
我是不是把这棵树弄错了?这更多的是业余爱好/学习项目,因此,如果我愿意,我总是可以放弃这个想法并尝试其他尝试。
答案 0 :(得分:0)
这当然是解决问题的一种方法。在您的示例中,假设您已经配置了httpBasic()
身份验证
@Override
protected void configure(HttpSecurity http) throws Exception {
http...
.httpBasic();
}
或formLogin()
身份验证
@Override
protected void configure(HttpSecurity http) throws Exception {
http...
.formLogin();
}
这些情况中的每一个都会在过滤器链中插入一个过滤器。这些过滤器将从标题(http-basic)或HTTP参数(form-login)中读取用户名和密码。它采用这些值并创建UsernamePasswordAuthenticationToken并调用您的自定义处理程序。
您也可以通过简单地实现过滤器而完全无需自定义身份验证提供程序来完成此操作
@Override
protected void configure(HttpSecurity http) throws Exception {
http...
.addFilter(new MyCustomFilter());
}
public static class MyCustomFilter extends OncePerRequestFilter {
public void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) {
if (<should we attempt authentication based on logic> {
try {
String username = ...
String password = ...
ApiAuthenticationServiceClient a = new ApiAuthenticationServiceClient();
a.authenticate(name, password);
//authentication successful return token
SecurityContextHolder
.getContext()
.setAuthentication(
new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>())
);
} catch(ApiAuthenticationException e) {
//Authentication failed maybe log it?
}
}
//continue
chain.doFilter(request, response);
}
千种为猫皮的方法。您选择一个适合您的产品。身份验证提供程序方法有效,您只需要知道有一个过滤器可以为您创建UsernamePasswordAuthenticationToken
对象。如果不配置这些过滤器,则永远不会获得回调到身份验证提供程序。