SpringSecurity01
SpringSecurity简介
权限管理的主流框架
- SpringSecurity
- 是Spring家族中的一个安全管理框架, 能和Spring无缝整合.
- 全面的权限控制
- 专门为web环境开发
- 旧版不能脱离web环境
- 新版对整个框架进行了分层抽取, 分成了核心模块和web模块, 单独引入核心模块即可脱离web环境.
- 是一款重量级框架
- Shiro
- 轻量级, 把复杂变简单, 针对性能有高要求的互联网应用有更好的表现.
- 通用性
- 好处: 不局限于web环境, 可以脱离web环境使用.
- 缺陷: 在web环境下一些特定的需求需要手动编写代码定制.
SpringSecurity的核心功能
- 认证(你是谁)
- 授权(你能干什么)
- 攻击防护(防止伪造)
- 本质上来讲, 其核心就是一组过滤器链.
SpringSecurity用法简介
- 用户登录系统时我们需要协助springsecurity把用户对应的角色, 权限组装好, 同时把各个资源所要求的权限信息设定好.
- 剩下的"登陆验证", "权限验证"等工作都交给springsecurity去做.
- 我们用一张图描述这个过程
权限过程中相关的概念
- 主体(principal)
- 使用系统的用户或设备或从其它系统远程登录的用户等.
- 简单点说, 谁使用系统谁就是主体.
- 认证(authentication)
- 权限管理系统确认一个主体的身份, 允许主体进入系统.
- 简单的说就是主体证明自己是谁
- 笼统的认为就是登陆操作.
- 授权(authorization)
- 将系统的权力授予主体, 这样主体就具备了系统中特定功能的能力.
- 简单的说授权就是给用户分配权限.
准备使用环境
- 创建maven的web工程
- 加入SpringMVC环境所需依赖
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.20.RELEASE</version> </dependency> <!-- 引入Servlet容器中相关依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!-- JSP页面使用的依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.1</version> <scope>provided</scope> </dependency>
- 创建SpringMVC配置文件
<context:component-scan base-package="xxx"></context:component-scan> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven></mvc:annotation-driven> <mvc:default-servlet-handler />
- 在web.xml中配置DispatcherServlet
<servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
加入SpringSecurity
- 加入SpringSecurity依赖
<!-- SpringSecurity对Web应用进行权限管理 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${bw.spring.security.version}</version> </dependency> <!-- SpringSecurity配置 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${bw.spring.security.version}</version> </dependency> <!-- SpringSecurity标签库 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>${bw.spring.security.version}</version> </dependency>
- 加入SpringSecurity控制权限的Filter
- SpringSecurity中使用过滤器Filter而不是拦截器Interceptor, 意味着SpringSecurity能够管理的不仅仅是SpringMVC中的controller请求, 还包含了web应用中的所有请求, 从而进行权限控制.
- SpringSecurity会根据DelegatingFilterProxy中的filter-name到IOC容器中查找所需要的bean, 所以filter-name必须是springSecurityFilterChain
<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>
- 加入配置类
//当前类标记为配置类 @Configuration // 启用web环境下权限控制功能 @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { }
- Enable理解为启用, 而@EnableWebSecurity注解表示启用Web安全功能.
- 必须要继承WebSecurityConfigurerAdapter, 该类里有其默认配置.
- 配置类中两个重要方法说明
@Override protected void configure(AuthenticationManagerBuilder builder) throws Exception { //跟SpringSecurity环境下用户登录相关 } @Override public void configure(HttpSecurity security) throws Exception { //跟SpringSecurity环境下请求授权相关 }
- 效果
- 所有请求都被SpringSecurity拦截, 登录以后才能访问.
- 静态资源也被拦截, 登陆失败有错误提示.