在Spring 4中配置不带XML的Spring Security

时间:2014-01-07 00:02:14

标签: spring authentication spring-security

我想使用custom authentication filter

  1. 捕获加密的标头令牌
  2. 验证后,提取用户的详细信息并以无状态方式将其添加到当前请求的安全上下文中
  3. 我希望能够使用此安全上下文持有者来获取有关当前请求用户正确处理其请求的详细信息。

    @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(); 
                }
            }
    

    那里有任何建议或类似的例子吗?

2 个答案:

答案 0 :(得分: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**

答案 1 :(得分:2)

我现在正在做类似的事情。有人可能会发现这有助于将来。 对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
            ;
    }
}