Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 预认证方案的认证成功处理程序_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Spring 预认证方案的认证成功处理程序

Spring 预认证方案的认证成功处理程序,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,我正在寻找一种方法,在用户从JavaEE容器(使用Kerberos)预验证时添加一些自定义代码。我使用SpringSecurity进行授权,这非常有效。但是现在我希望能够使用一个简单的Spring服务(然后是存储库)方法检测数据库中是否存在当前用户 我的SecurityConfig.java文件 @Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter

我正在寻找一种方法,在用户从JavaEE容器(使用Kerberos)预验证时添加一些自定义代码。我使用SpringSecurity进行授权,这非常有效。但是现在我希望能够使用一个简单的Spring服务(然后是存储库)方法检测数据库中是否存在当前用户

我的SecurityConfig.java文件

@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后,都会调用自定义筛选器,您可以进行自定义检查。