用户登录拦截-----SpringSecurity框架的使用
程序员文章站
2024-03-19 14:13:58
...
1.SpringSecurity框架介绍
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
它可以完成什么工作?
- 用户登录,未登录拦截,已登录放行,指定什么页面不拦截
2.具体使用
- 导包(在web层添加)
<!-- 身份验证 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
- 修改web.xml文件(在web层添加)
<!-- 读取springSecurity的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-security.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 这是一个过滤器代理类,也是springSecurity的入口,以前我们定义的时候名字都是自定义的随便改,但现在不能改,固定这个名字,不然springSecurity找不到 -->
<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>
- 书写spring-security.xml配置文件(在web层添加)
注意页面的标签是 <beans:beans >,与其他页面不同,这个文件也是这个框架的主要配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" 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">
<!-- 设置页面不登陆也可以访问 -->
<http pattern="/*.html" security="none"></http>
<http pattern="/css/**" security="none"></http>
<http pattern="/img/**" security="none"></http>
<http pattern="/js/**" security="none"></http>
<http pattern="/plugins/**" security="none"></http>
<!-- 页面的拦截规则 use-expressions:是否启动SPEL表达式 默认是true -->
<http use-expressions="false">
<!-- 当前用户必须有ROLE_USER的角色 才可以访问根目录及所属子目录的资源 -->
<intercept-url pattern="/**" access="ROLE_ADMIN"/>
<!-- 开启表单登陆功能 -->
<!-- login-page:登录页面; default-target-url:登录成功跳转页面; authentication-failure-url:登录失败跳转页面 -->
<!-- always-use-default-target: 每次登陆都跳转到默认的页面(这里的默认页面:default-target-url="/admin/index.html"),不然会跳转到我们访问时被拦截的页面,这种适用于前端,后端不适合-->
<form-login login-page="/login.html" default-target-url="/admin/index.html" authentication-failure-url="/login.html" always-use-default-target="true"/>
<!-- 如果是jsp页面,就不需要加这个,但是我们这里是html页面,所以我们要关闭它 (不写会报错403)-->
<!-- CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,
通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。 -->
<csrf disabled="true"/>
<!-- 默认会拦截<iframe>标签(分区域标签),添加这个即可使其不拦截 -->
<headers>
<frame-options policy="SAMEORIGIN"/>
</headers>
<!-- 用户退出配置,退户后会自动回到登录页面,自动会生成" /logout ",再到前端注销按钮处配置:href="../logout" (../是因为当前是在admin目录下,要返回webapp目录),点一下即可注销用户 -->
<logout/>
</http>
<!-- 认证管理器 -->
<authentication-manager>
<authentication-provider>
<user-service>
<!-- 定义登录账号密码,指定谁使用这个账号密码才能访问,可以添加很多歌 -->
<user name="admin" password="123456" authorities="ROLE_ADMIN"/>
<user name="sunwukong" password="dasheng" authorities="ROLE_ADMIN"/>
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
- html页面的一些配置
a.提交页面的 “action” 地址
<!-- action中的提交地址是 SpringSecurity 框架自动给你生成的-->
<form class="sui-form" action="/login" method="post" id="loginform">
b.注销用户的注销按钮
<div class="pull-right">
<!--与 "spring-security.xml" 中的 <logout/> 相对应 -->
<a href="../logout" class="btn btn-default btn-flat">注销</a>
</div>
推荐阅读