【问题标题】:Configure Spring Security without XML in Spring 4在 Spring 4 中配置没有 XML 的 Spring Security
【发布时间】:2014-01-24 13:02:48
【问题描述】:

我想使用custom authentication filter

  1. 捕获加密的标头令牌
  2. 验证后,提取用户的详细信息并以无状态的方式将它们添加到当前请求的安全上下文中

我希望能够使用此安全上下文持有者来获取有关当前请求用户正确处理其请求的详细信息。

@RequestMapping(value = "/simple", method = RequestMethod.POST)
@ResponseBody
@Transactional
@Preauthorize(...)
public String simple(){
   //collect the user's current details from the getPrinciple() and complete the transaction...
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    return "Simple";
}

我以前在 XML 中这样做过:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:security="http://www.springframework.org/schema/security"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">

    <security:global-method-security
        secured-annotations="enabled" />

    <security:http pattern="/**"
        auto-config="true" disable-url-rewriting="true" use-expressions="true">
        <security:custom-filter ref="authenticationTokenProcessingFilter"
            position="FORM_LOGIN_FILTER" />
        <security:intercept-url pattern="/authenticate"
            access="permitAll" />
        <security:intercept-url pattern="/secure/**"
            access="isAuthenticated()" />
    </security:http>

    <bean id="CustomAuthenticationEntryPoint" class="org.foo.CustomAuthenticationEntryPoint" />

    <bean class="org.foo.AuthenticationTokenProcessingFilter" id="authenticationTokenProcessingFilter">
        <constructor-arg ref="authenticationManager" />
    </bean>

</beans>

但是,我希望它可以在非 xml WebSecurityConfigurerAdapter 中与较新的Spring Boot 应用程序一起使用,就像他们的 Spring Boot 文件中的示例一样:

    @Bean
    public ApplicationSecurity applicationSecurity() {
        return new ApplicationSecurity();
    }

    @Order(Ordered.LOWEST_PRECEDENCE - 8)
    protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // this is obviously for a simple "login page" not a custom filter!
http.authorizeRequests().anyRequest().fullyAuthenticated().and().formLogin()
                        .loginPage("/login").failureUrl("/login?error").permitAll(); 
            }
        }

有什么建议或类似的例子吗?

【问题讨论】:

    标签: spring authentication spring-security


    【解决方案1】:

    我现在正在做类似的事情。将来有人可能会发现这很有帮助。 将 xml 转换为 java 配置会使其如下所示:

    import javax.servlet.Filter;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    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.WebSecurityConfigurerAdapter;
    import org.springframework.security.web.AuthenticationEntryPoint;
    import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
    
    @EnableGlobalMethodSecurity(securedEnabled=true) //<security:global-method-security secured-annotations="enabled" />
    public class ApplicationSecurity extends WebSecurityConfigurerAdapter {
    
        @Autowired
        @Qualifier("authenticationTokenProcessingFilter")
        private Filter authenticationTokenProcessingFilter;
    
        @Autowired
        private AuthenticationEntryPoint entryPoint;
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.exceptionHandling().authenticationEntryPoint(entryPoint);
    
    
            http //auto-config="true"
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .and()
                .httpBasic();
    
    
            http
                .authorizeRequests() // use-expressions="true"
                .antMatchers("/authenticate").permitAll() //<security:intercept-url pattern="/authenticate" access="permitAll" />
                .antMatchers("/secure/**").authenticated() //<security:intercept-url pattern="/secure/**"            access="isAuthenticated()" />
                .and()
                .addFilterBefore(authenticationTokenProcessingFilter, UsernamePasswordAuthenticationFilter.class) // <security:custom-filter ref="authenticationTokenProcessingFilter" position="FORM_LOGIN_FILTER" /> http://docs.spring.io/spring-security/site/docs/3.0.x/reference/ns-config.html
                ;
        }
    }
    

    【讨论】:

      【解决方案2】:

      您应该对此感兴趣:

      Security Method Annotations with Java Configuration and Spring Security 3.2

      http://spring.io/blog/2013/07/04/spring-security-java-config-preview-method-security/

      从你所做的事情来看,我在你发布的代码中没有看到这个注释。

      **@EnableGlobalMethodSecurity**
      

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 2017-03-03
        • 2017-01-27
        • 2015-11-19
        • 2014-02-25
        • 2021-02-15
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        相关资源
        最近更新 更多