此项目是基于普通的web项目进行搭建的SpringSecurity入门环境,如果需要SpringBoot项目的SpringSecurity入门案例可以去看这个SpringSecurity基于SpringBoot的简单环境搭建
前提
搭建之前先搞清楚两个词语,虽然在这次案例中没有完全体现出来。
认证:通过用户名和密码成功登录系统后,让系统得到单签用户的角色身份。
授权:系统根据当前用户的角色,给其授予对应可以操作的权限资源。
概念
SpringSecurity是Spring采用了AOP的思想,基于servlet过滤器实现的安全框架,它提供了完善的的认证机制和方法级的授权功能。
简单实现
- 导入jar包
需要的jar包有4个:spring-security-core.jar,spring-security-web.jar,spring-security-config.jar和spring-security-taglibs.jar4个jar包
包名 | 作用 |
---|---|
spring-security-core.jar | 核心包,springsecurity的任何功能都需要这个jar包 |
spring-security-web.jar | web工程必备的包,包含过滤器和相关的web安全基础结构代码 |
spring-security-config.jar | 用于解析xml配置文件,SpringSecurity的xml配置文件解析用的就是这个包 |
spring-security-taglibs.jar | SpringSecurity提供的动态标签库,JSP页面也可以使用 |
- 配置web.xml文件
<!--SpringSecurity核心过滤器链-->
<!--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>
- SpringSecurity的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<!--释放静态资源:这一部分资源可以说是脱离的SpringSecurity-->
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/>
<security:http pattern="/failer.jsp" security="none"/>
<!--配置springSecurity-->
<!--
auto-config="true" 表示自动加载springsecurity的配置文件
use-expressions="true" 表示使用spring的el表达式来配置springsecurity
-->
<security:http auto-config="true" use-expressions="true">
<!--让认证页面可以匿名访问-->
<security:intercept-url pattern="/login.jsp" access="permitAll()"/>
<!--拦截资源-->
<!--
pattern="/**" 表示拦截所有资源
access="hasAnyRole('ROLE_USER')" 表示只有ROLE_USER角色才能访问资源
-->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER')"/>
<!--配置认证信息-->
<security:form-login login-page="/login.jsp"
login-processing-url="/login"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"/>
<!--配置退出登录信息,请求方式必须是post-->
<security:logout logout-url="/logout"
logout-success-url="/login.jsp"/>
<!--去掉csrf拦截的过滤器:不关闭且没配置token而且还是'GET','HEAD','TRACE','OPTIONS'的话已有异域请求问题导致报错-->
<!--<security:csrf disabled="true"/>-->
</security:http>
<!--把加密对象放入的IOC容器中-->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<!--设置Spring Security认证用户信息的来源-->
<!--
springsecurity默认的认证必须是加密的,加上{noop}表示不加密认证,这里是用了写死的账号密码和角色。
-->
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="user" password="{noop}user" authorities="ROLE_USER"/>
<security:user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
<!--下面是动态从数据库中获取登录的验证和角色的赋予,实际上就是交给了一个实现了特定UserDetailsService接口的userservice接口来实现-->
<!--
<security:authentication-manager>
<security:authentication-provider user-service-ref="userServiceImpl">
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
-->
</beans>