Spring Security安全控制

概述


  Spring Security是Spring项目的安全框架,基于IoC和AOP来实现安全的功能.

  Spring Security有两个重要概念:

  • 认证(Authentication),认证即确认用户可以访问当前系统.
  • 授权(Authorization),授权即确定用户在当前系统下所拥有的权限.

配置


  Spring Security使用过滤器来实现所有安全的功能,我们只需要注册一个特殊的DelegationFilterProxy过滤器到WebApplicationInitializer即可(WebApplicationInitializer是Spring提供用来配置Servlet3.0+配置的接口,从而替代web.xml,实现此接口的类会自动被SpringServletContainerInitializer加载,启动Servlet容器).

  也可以让自定义的Initializer类继承AbstractSecurityWebApplicationInitializer抽象类,这个抽象类实现了WebApplicationInitializer接口,并通过onStartup方法调用.它已经注册了DelegationFilterProxy过滤器.

Spring Security配置类


  只需要在配置类上使用@EnableWebSecurity注解,然后继承WebSecurityConfigurerAdapter.可以通过重写configure方法来配置相关的内容.

  在Spring Security中,通过重写以下方法放行静态资源:

Authentication


  在Spring Security中,通过重写以下方法来完成认证的配置:

  认证用户需要用户数据的来源,AuthenticationManagerBuilder提供了内存中和JDBC的两种用户数据来源.

  • 内存中

  • JDBC

  如果需要自定义用户数据来源,则可以通过实现UserDetailsService接口.

Role实体类

User实体类

自定义用户认证

注册自定义的用户认证

Authorization


  在Spring Security中,通过重写以下方法来完成授权的配置:

  Spring Security使用2种匹配器用来匹配请求路径:

  • antMatchers:使用Ant风格的路径匹配.
  • regexMatchers:使用正则表达式匹配路径.

  Spring Security提供以下方法用于安全处理:

Method Description
anyRequest() 匹配所有请求路径.
access(String) Spring EL表达式结果为true时可以访问.
anonymous() 匿名可访问.
denyAll() 用户不能访问.
fullyAuthenticated() 用户完全认证时可访问.
hasAnyAuthority(String…) 如果用户有参数,则其中任一权限可访问.
hasAnyRole(String…) 如果用户有参数,则其中任一角色可访问.
hasAuthority(String) 如果用户有参数,则其权限可访问.
hasIpAddress(String) 如果用户来自参数中的IP则可访问.
hasRole(String) 如果用户有参数中的角色可访问.
permitAll() 用户可任意访问.
rememberMe() 允许通过remember-me登陆的用户访问.
authenticated() 用户登录后可访问

自定义登录实现


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated() // 所有请求需要认证登陆后才能访问.
.and()
.formLogin() // 通过formLogin定制登录操作.
.loginPage("/login") // 定制登录页面的访问地址.
.defaultSuccessUrl("/index") // 登录成功后转向的页面.
.failureUrl("/login?error") // 登录失败后转向的页面.
.permitAll()
.and()
.rememberMe() // 开启cookie存储用户信息.
.tokenValiditySeconds(1209600) // 指定cookie的有效时间,单位为秒.
.key("userKey") // 指定cookie中的私钥.
.and()
.logout() // 通过logout()定制注销操作.
.logoutUrl("/logout") // 指定注销的URL路径.
.logoutSuccessUrl("/index") // 指定注销成功后转向的页面.
.permitAll();
}

Spring Boot支持


  Spring Boot主要通过SecurityAutoConfiguration和SecurityProperties来完成自动配置.

  SecurityAutoConfiguration导入了SpringBootWebSecurityConfiguration中的配置,我们可以获得如下的自动配置:

  1. 自动配置了一个内存中的用户,账号为user,密码在程序启动时print在控制台中.
  2. 放行了/css/**,/js/**,/images/**,/**/favicon.ico等静态文件存放的路径.
  3. 自动配置的securityFilterChainRegistration的Bean.
  4. 使用以security为前缀的属性配置Security相关的配置.
    1
    2
    3
    4
    5
    6
    7
    security.user.name=#内存中的默认用户账号,默认为user.
    security.user.password=#默认用户的密码.
    security.user.role=#默认用户的角色.
    security.require-ssl=false #是否需要ssl支持,默认为false.
    security.enable-csrf=false #是否开启“跨站请求伪造”支持,默认false.
    security.ignored= #用逗号隔开需要放行的路径.
    ....

当我们需要自定义扩展配置的时候,只需要配置类继承WebSecurityConfigurerAdapter即可,不需要使用@EnableWebSecurity注解开启支持.

end

资料参考于 JavaEE开发的颠覆者: Spring Boot实战

分享