1.Spring Security介绍:Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。安全包括两个主要操作:
(1)“认证”,是为用户建立一个他所声明的主体。主题一般式指用户,设备或可以在你系 统中执行动作的其他系统。
(2)“授权”指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由 身份验证过程建立了。
2.在pom.xml导入spring security的依赖:
<spring.security.version>5.0.1.RELEASE</spring.security.version>
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>${spring.security.version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>${spring.security.version}</version> </dependency>
3.在web.xml中创建filter
<!-- 配置加载类路径的配置文件,添加spring-security.xml --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml,classpath*:spring-security.xml</param-value> </context-param>
<!-- spring-security的配置-->
<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>
4.在resource资源目录下创建spring-security.xml。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd"> <!--auto-config="true"配置为我们自动默认提供一个登陆窗口,用户也可以设置使用自己的页面--> <security:http auto-config="true" use-expressions="false"> <!--对所有的请求资源进行拦截,除非具有ROLE_USER的角色项目测试的时候,用user登陆可以成功 但是用admin登陆页面出现403权限不足的问题,因为这里没有设置admin角色--> <security:intercept-url pattern="/**" access="ROLE_USER" /> </security:http> <!--配置了两个用户,一个用户是user,密码也是user,另外一个用户是admin,密码也是admin--> <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> </beans>
5.启动项目测试,发现页面上出现了一个登陆窗口,这个登陆窗口在整个工程中没有,因为spring security默认为我提供了一个登陆窗口,登陆成功默认访问的是index.jsp,用户可以设置使用自己的登陆页面,登陆成功跳到那个页面,失败跳到哪个页面,首先在WEB-INFO下书写自己的登陆,成功,失败页面,在spring-security.xml进行添加:
<!-- 配置不拦截的资源 -->
<security:http pattern="/login.jsp" security="none"/>
<security:http pattern="/failer.jsp" security="none"/>
<security:http pattern="/css/**" security="none"/>
<security:http pattern="/img/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/>
<security:http auto-config="true" use-expressions="true">
<!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" -->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
<!-- 定义跳转的具体的页面 -->
<security:form-login
login-page="/login.jsp"
login-processing-url="/login.do"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"
authentication-success-forward-url="/pages/main.jsp"
/>
<!-- 关闭跨域请求 -->
<security:csrf disabled="true"/>
</security:http>