Spring 预认证方案的认证成功处理程序
我正在寻找一种方法,在用户从JavaEE容器(使用Kerberos)预验证时添加一些自定义代码。我使用SpringSecurity进行授权,这非常有效。但是现在我希望能够使用一个简单的Spring服务(然后是存储库)方法检测数据库中是否存在当前用户 我的SecurityConfig.java文件Spring 预认证方案的认证成功处理程序,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,我正在寻找一种方法,在用户从JavaEE容器(使用Kerberos)预验证时添加一些自定义代码。我使用SpringSecurity进行授权,这非常有效。但是现在我希望能够使用一个简单的Spring服务(然后是存储库)方法检测数据库中是否存在当前用户 我的SecurityConfig.java文件 @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.logout()
.logoutUrl("/rest/logout")
.logoutSuccessUrl("/static/jsp/logout.jsp")
.invalidateHttpSession(true)
.permitAll()
.and()
.authorizeRequests()
.antMatchers("/login","/accessDenied", "/resources/**", "/static/*").permitAll()
.antMatchers("/security/*").hasRole("ADMIN")
.anyRequest().authenticated()
.anyRequest().hasRole("USER")
.and().anonymous().disable()
.jee()
.mappableRoles("USER","ADMIN");
}
}
我的堆栈:
- JBoss7.2
- SpringMVC4.0.6
- Spring Security 3.2.4
谢谢您可以像这样实现AuthenticationSuccessHandler
@Component
public class MyAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
@Autowired
private UserService userService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws ServletException, IOException {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth == null && auth.isAuthenticated()) {
String username = auth.getPrincipal().toString();
UserData userData = userService.getUserData(username);
// And then here more checks, handlings etc.
}
super.onAuthenticationSuccess(request, response, authentication);
}
}
然后注册
我希望有帮助 您想检查用户是否经过身份验证并且存在于数据库中吗?好的,我想在用户经过预身份验证之后立即调用我的逻辑(只要Spring Security知道它是通过容器进行身份验证的),然后我会进行检查:如果数据库中不存在用户记录,则根据LDAP中的详细信息创建它。如果存在,则从数据库加载它并更新上次登录时间戳。我已经尝试了该路由,但该方法从未被调用。我已经添加了一个断点和一个sysout,不幸的是它没有触发…可能是您没有正确注册它。您的配置方式与我当前基于xml的配置略有不同。我会在家里尝试,希望能让您知道如何正确注册成功处理程序。是的,我正在使用Java配置,但我可以非常轻松地转换XML配置。那么可能就不需要实现成功处理程序了。尝试实现一个使用J2eePreAuthenticatedProcessingFilter的过滤器,并使用addFilter方法添加此过滤器。所以每次调用此筛选器时,您都可以检查数据库中是否存在preAuthenticatedPrincipal,并根据它进行一些处理。我不是很确定这一点,因为我以前没有使用J2EEPreAuthenticatedProcessingFilter。实际上,也许有一种更干净的方法可以做到这一点。我认为,您可以创建一个独立的筛选器,它包含与MyAuthenticationSuccessHandler类似的逻辑(参见上面的示例)。唯一的区别是,您必须将逻辑放入doFilter()方法中。并通过addFilterAfter(myFilter,J2eePreAuthenticatedProcessingFilter.class)注册此筛选器。因此,每次执行J2EEPreAuthenticateProcessingFilter后,都会调用自定义筛选器,您可以进行自定义检查。