1. 程式人生 > >Spring Security許可權管理框架

Spring Security許可權管理框架

Spring Security

Spring Security是作為過濾器控制權限的,在web.xml中配置過濾器。

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter
-name> <url-pattern>/*</url-pattern> </filter-mapping>
定義security配置
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws
Exception { auth.inMemoryAuthentication().withUser("bill").password("abc123").roles("USER"); auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/"
, "/home").permitAll() .antMatchers("/admin/**").access("hasRole('ADMIN')") .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") //使用and()新增新的配置選項 //登入頁設定為允許所有使用者訪問 .and().formLogin().loginPage("/login").permitAll() .and().exceptionHandling().accessDeniedPage("/Access_Denied"); } }

配置類需要@EnableWebSecurity、@EnableGlobalMethodSecurity、@EnableGlobalAuthentication中的一個標註。
access(“hasRole(‘ADMIN’)”) =access(“ROLE_ADMIN”)

configure()函式的配置對應XML為:

 <http auto-config="true">  
        <intercept-url pattern="/*" access="ROLE_USER" />  
        <form-login login-page="/" default-target-url="/" authentication-failure-url="/?                   login=error" />
        <logout logout-success-url="/" />
 </http>  
環境初始化

1.單獨使用spring security,需要將MySecurityConfig傳入並構造初始化Security環境的例項。該類自動將應用中的每個url註冊到SpringSecurityFilterChain,並且載入Security的配置。

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {

    public SecurityWebApplicationInitializer() {
        super(MySecurityConfig.class);
    }
}

2.如果專案中使用了Spring,則專案中存在初始化Web環境的類,這時將Spring Security註冊到已經存在的ApplicationContext中。

import org.springframework.security.web.context.*;

public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {

}

這個類將應用中的url註冊到SpringSecurityFilterChain。然後需要將MySecurityConfig載入到已經存在的程式上下文中。

public class SpringMvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { MySpringSecurityConfiguration.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}
Security中的類

Authentication

Authentication介面表示使用者認證資訊,使用者登入認證之前相關資訊會封裝為一個Authentication具體實現類的物件,登入認證後會生成一個包含使用者許可權的Authentication物件,並儲存在SecurityContextHolder的Context中。

//獲得使用者名稱
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String username=((UserDetails) principal).getUsername();

AuthenticationManager

AuthenticationManager是一個用來處理認證(Authentication)請求的介面。在其中只定義了一個方法authenticate(),該方法只接收一個代表認證請求的Authentication物件作為引數,如果認證成功,則會返回一個封裝了當前使用者許可權等資訊的Authentication物件進行返回。
AuthenticationManager的預設實現是ProviderManager,但是它不直接自己處理認證請求,而是委託給其所配置的AuthenticationProvider列表,然後會依次使用每一個AuthenticationProvider進行認證,如果有一個AuthenticationProvider認證後的結果不為null,則表示該AuthenticationProvider已經認證成功,之後的AuthenticationProvider將不再繼續認證。如果所有的AuthenticationProvider的認證結果都為null,則表示認證失敗,將丟擲一個ProviderNotFoundException。

     <authentication-manager>  
             //user-service-ref指定關聯哪個AuthenticationProvider,預設為DaoAuthenticationProvider
            <authentication-provider user-service-ref="">  
            </authentication-provider>  
    </authentication-manager>  

預設情況下,認證成功後ProviderManager將清除返回的Authentication中的憑證資訊(密碼等),因此無法直接將Authentication快取用於以後的登入認證。一種辦法是設定ProviderManager的eraseCredentialsAfterAuthentication屬性為false。