在Spring安全性中以编程方式自定义WebAuthenticationDetails

时间:2015-10-27 04:47:33

标签: spring spring-mvc spring-security

我目前正在从基于xml的spring安全配置迁移到基于java的配置。我需要通过Java设置自定义WebAuthenticationDetails。有没有办法做到这一点?在XML中,我只想设置UsernamePasswordAuthenticationFilter的authenticationDetailsS​​ource。

下面的相关示例
<http entry-point-ref="loginUrlAuthenticationEntryPoint">
     <custom-filter  ref="rememberMeFilter" position="REMEMBER_ME_FILTER"/>
     <custom-filter ref="loginFilter" position="FORM_LOGIN_FILTER"/>    
     <intercept-url pattern="/access/**" access="ROLE_USER" />
     <csrf/>
    <access-denied-handler error-page="/login" />
    <logout logout-success-url="/login?logout" />
</http>


    <beans:bean id="myWebAuthDetails"
    class="com.auth.CustomWebAuthenticationDetailsSource">
</beans:bean>

     <beans:bean id="loginFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
  <beans:property name="authenticationManager" ref="authenticationManager" />
  <beans:property name="rememberMeServices" ref="rememberMeServices" />
  <beans:property name="usernameParameter" value="username" />
  <beans:property name="passwordParameter" value="password" />
  <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="allowSessionCreation" value="true" />
  <beans:property name="authenticationDetailsSource" ref="myWebAuthDetails" />
  <beans:property name="authenticationFailureHandler" ref="failureHandler" />
  <beans:property name="authenticationSuccessHandler" ref="successHandler" />
  <beans:property name="filterProcessesUrl" value="/processlogin" />
</beans:bean>

1 个答案:

答案 0 :(得分:10)

请在下面找到配置。我已将您的xml配置映射到Java配置。

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated().and().formLogin()
                .authenticationDetailsSource(authenticationDetailsSource())
                .successHandler(authenticationSuccessHandler())
                .failureHandler(failureHandler()).loginPage("/login")
                .usernameParameter("usernameCustom")
                .passwordParameter("passwordCustom").permitAll().and().logout()
                .permitAll().and().rememberMe()
                .rememberMeServices(rememberMeServices());
    }

    private AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> authenticationDetailsSource() {

        return new AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails>() {

            @Override
            public WebAuthenticationDetails buildDetails(
                    HttpServletRequest request) {
                return new WebAuthenticationDetails(request);
            }

        };
    }

    @Bean
    RememberMeServices rememberMeServices() {
        RememberMeServices rememberMeServices = new RememberMeServices() {

            @Override
            public void loginSuccess(HttpServletRequest arg0,
                    HttpServletResponse arg1, Authentication arg2) {

            }

            @Override
            public void loginFail(HttpServletRequest arg0,
                    HttpServletResponse arg1) {

            }

            @Override
            public Authentication autoLogin(HttpServletRequest arg0,
                    HttpServletResponse arg1) {
                return null;
            }
        };
        return rememberMeServices;
    }

    @Bean
    AuthenticationFailureHandler failureHandler() {

        return new AuthenticationFailureHandler() {

            @Override
            public void onAuthenticationFailure(HttpServletRequest req,
                    HttpServletResponse res, AuthenticationException arg2)
                    throws IOException, ServletException {
                req.setAttribute("error", "forward");
                req.getRequestDispatcher("/homedefault").forward(req, res);
            }

        };
    }

    @Bean
    AuthenticationSuccessHandler authenticationSuccessHandler() {
        return new AuthenticationSuccessHandler() {

            @Override
            public void onAuthenticationSuccess(HttpServletRequest req,
                    HttpServletResponse res, Authentication arg2)
                    throws IOException, ServletException {
                res.sendRedirect("homedefault");
            }
        };
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password")
                .roles("USER");
    }
}