SpringSecurity

配置详解

登录配置

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated() //1
            .and()
        .formLogin() //2
            .and()
        .httpBasic(); //3
}

1.确保我们应用中的所有请求都需要用户被认证

2.允许用户进行基于表单的认证

3.允许用户使用HTTP基于验证进行认证

java配置使用and()方法相当于XML标签的关闭

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login") //1
            .permitAll();//2        
}

1.指定登录页的路径

2.我们必须允许所有用户访问我们的登录页(例如为验证的用户),这个formLogin().permitAll()方法允许基于表单登录的所有的URL的所有用户的访问。

验证请求

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()   //1                                                             
            .antMatchers("/resources/**", "/signup", "/about").permitAll()       //2           
            .antMatchers("/admin/**").hasRole("ADMIN")    //3                                  
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")       //4     
            .anyRequest().authenticated()    //5                                            
            .and()
        // ...
        .formLogin();
}

1.http.authorizeRequests()方法有多个子节点,每个macher按照他们的声明顺序执行。

2.我们指定任何用户都可以通过访问的多个URL模式。任何用户都可以访问URL以”/resources/”, equals “/signup”, 或者 “/about”开头的URL。

3.以 “/admin/” 开头的URL只能由拥有 “ROLE_ADMIN”角色的用户访问。请注意我们使用 hasRole 方法,没有使用 “ROLE_” 前缀.

4.任何以”/db/” 开头的URL需要用户同时具有 “ROLE_ADMIN” 和 “ROLE_DBA”。和上面一样我们的 hasRole 方法也没有使用 “ROLE_” 前缀.
5.尚未匹配的任何URL要求用户进行身份验证

处理登出

当使用WebSecurityConfigurerAdapter, 注销功能会自动启用。默认是访问URL/logout将注销登陆的用户:

1.使HTTP Session 无效

2.清除所有已经配置的 RememberMe 认证

3.清除SecurityContextHolder

4.跳转到 /login?logout

protected void configure(HttpSecurity http) throws Exception {
    http
        .logout()      // 1                                                          
            .logoutUrl("/my/logout")  //2                                               
            .logoutSuccessUrl("/my/index")  //3                                         
            .logoutSuccessHandler(logoutSuccessHandler) //4                              
            .invalidateHttpSession(true)      //5                                       
            .addLogoutHandler(logoutHandler)  //6                                        
            .deleteCookies(cookieNamesToClear)   //7                                    
            .and()
        ...
}

1.提供注销支持,使用WebSecurityConfigurerAdapter会自动被应用。

2.设置触发注销操作的URL (默认是/logout). 如果CSRF内启用(默认是启用的)的话这个请求的方式被限定为POST。

3.注销之后跳转的URL。默认是/login?logout。

4.让你设置定制的 LogoutSuccessHandler。如果指定了这个选项那么logoutSuccessUrl()的设置会被忽略。

5.指定是否在注销时让HttpSession无效。 默认设置为 true。 在内部配置SecurityContextLogoutHandler选项。

6.添加一个LogoutHandler.默认SecurityContextLogoutHandler会被添加为最后一个LogoutHandler。

7.允许指定在注销成功时将移除的cookie。

LogoutHandler接口实现类
AbstractRememberMeServices //
CompositeLogoutHandler //
CookieClearingLogoutHandler //
CsrfLogoutHandler //
PersistentTokenBasedRememberMeServices //
SecurityContextLogoutHandler //
TokenBasedRememberMeServices //

验证

内存中的身份验证

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

将用户信息配置到内存中进行验证

JDBC验证

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .jdbcAuthentication()
            .dataSource(dataSource)
            .withDefaultSchema()
            .withUser("user").password("password").roles("USER").and()
            .withUser("admin").password("password").roles("USER", "ADMIN");
}

dataSource 配置数据库连接信息