首先我们先对Spring Security进行简单的介绍:
Spring Security是专门针对基于Spring的项目的安全框架,充分利用了aop和依赖注入来实现安全的功能。安全框架有两个重要的概念,即认证和授权。认证即确认用户可以访问当前系统;授权即确定用户在当前系统下所拥有的功能权限。
Spring Security的配置
1)DelegatingFilterProxy
Spring Security为我们提供了一个或多个过滤器来实现所有安全的功能,我们只需注册一个特殊的DelegatingFilterProxy过滤器到WebApplicationInitializer即可。
而在实际应用中,我们只需要让自己的Initializer类继承AbstractSecurityWebApplicationInitializer抽象类即可。AbstractSecurityWebApplicationInitializer实现了WebApplicationInitializer接口,并通过onStartup方法调用。
insertSpringSecurityFilterChain(servletContext);
它为我们注册了DelegatingFilterProxy。insertSpringSecurityFilterChain源码如下:
配置
Spring Security的配置和Spring MVC的配置类似,只需在一个配置类上注解@EnableWebSecurity,并让这个类继承WebSecurityCOnfigurerAdapter即可。我们可以通过重写configure方法来配置相关的安全配置。
代码如下:
用户认证
认证需要我们有一套用户数据的来源,而授权则是对于某个用户有相应的角色权限。
在Spring Security里我们通过重写Protected void configure(AuthenticationManagerBuilder auth)方法来实现定制。
1)内存中的用户
使用AuthenticationManagerBuilder的inMemoryAuthentication方法即可添加在内存中的用户,并可给用户指定角色权限。
2)JDBC中的用户
JDBC中的用户直接指定dataSource即可。
不过这看上去很奇怪,其实这里的Spring Security是默认了你的数据库结构的。通过jdbcAuthentication的源码,我们可以看出JdbcDaoImpl中定义默认的用户及角色权限获取的SQL语句:
当然我们可以自定义我们的查询用户和权限的SQL语句,例如:
3)通用的用户
上面的两种用户和权限的获取方式只限于内存或者JDBC,我们的数据访问方式可以是多种多样的,可以是非关系型数据库,也可以是我们常用的JPA等。
这时我们需要自定义实现UserDetailsService接口。上面的内存中用户及JDBC用户就是UserDetailsService的实现,定义如下:
说明:SysUser是我们系统的用户领域对象类,User来自于org.springframework.Security.core.userdetails.User。除此之外,我们还需要注册这个CustomUserService,代码如下:
请求授权:
Spring Security是通过重写Protected void configure(HttpSecutity http)方法来实现请求拦截的。
Spring Security使用以下匹配器来匹配请求路径:
antMatchers:使用Ant风格的路径匹配
regexMatchers:使用正则表达式匹配路径
anyRequest:匹配所有请求路径
在匹配了请求路径后,需要针对当前用户的信息对请求路径进行安全处理,
Spring Security提供了表9-1所示的安全处理方法。
我们可以看一下下面的示例代码:
代码解释:
1)通过authorizeRequests方法来开始请求权限配置。
2)请求匹配/admin/**,只有拥有Role_ADMIN角色的用户可以访问。
3)请求匹配到/user/**,拥有ROLE_ADMIN或ROLE_USER角色的用户都可访问。
4)其余所有的请求都需要认证后(登陆后)才可访问。
定制登录行为
我们也可以通过重写
Protected void configure(httpSecurity http)
方法来定制我们的登录行为。
下面将重用的登录行为的定制以简短的代码演示:
代码解释:
1)通过formLogin方法定制登录操作。
2)使用loginPage方法定制登录页面的访问地址。
3)defaultSuccessUrl指定登录成功后转向的页面。
4)failureUrl指定登录失败后转向的页面。
5)rememberMe开启cookie存储用户信息。
6)tokenValiditySeconds指定cookie有效期为1209600秒,即2个星期
7)key指定cookie中的私钥。
8)使用logout方法定制注销行为。
9)logoutUrl指定注销的URL路径
10)logoutSuccessUrl指定注销成功后转向的页面
参考书籍:JavaEE开发的颠覆者 Spring Boot实战
下一篇讲解spring boot整合Spring Security