一、认识Spring-Security
1.概念:
概述: Spring-Security
Spring中提供安全认证服务的框架
认证:验证用户密码是否正确的过程
授权:对用户能访问的资源进行控制
SpringSecurity是Spring提供的一个安全框架,提供认证和授权功能,最主要的是它提供了简单的使用方式,同时又有很高的灵活性,简单,灵活,强大。
2.SpringSecurity 流程图:
流程说明:
1.客户端发起一个请求,进入 Security 过滤器链。
2.当到 LogoutFilter 的时候判断是否是登出路径,如果是登出路径则到 logoutHandler ,如果登出成功则到 logoutSuccessHandler 登出成功处理,如果登出失败则由 ExceptionTranslationFilter ;如果不是登出路径则直接进入下一个过滤器。
3.当到 UsernamePasswordAuthenticationFilter 的时候判断是否为登录路径,如果是,则进入该过滤器进行登录操作,如果登录失败则到 AuthenticationFailureHandler 登录失败处理器处理,如果登录成功则到 AuthenticationSuccessHandler 登录成功处理器处理,如果不是登录请求则不进入该过滤器。
4.当到 FilterSecurityInterceptor 的时候会拿到 uri ,根据 uri 去找对应的鉴权管理器,鉴权管理器做鉴权工作,鉴权成功则到 Controller 层否则到 AccessDeniedHandler 鉴权失败处理器处理。
引用自
二、在项目中的具体实现步骤
1.往项目中导入jar包
1.1. 在项目中找到pom.xml文件,将 <spring.security.version>5.0.1.RELEASE</spring.security.version>
添加到properties标签中。
1.2. 在dependencies标签中加入下面的内容:
<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>
出现错误后,按住alt+enter键进行jar包的下载导入。
pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件。
2.在web.xml文件中配置Security的过滤器
3.配置Spring-security.xml文件
在这里需要说明的是,在上面的43行代码中可能会出现错误,但是不要再此做修改,这是固定写法,只需要在你的service层下的实现类中修改为@Service(“userService”)就可以了。
4.对数据库中的表做相关操作
针对于我的项目,我的有关需求是把当前user表和 role 表关联起来,实现一对多的关系,这就需要我在数据库中新增一张表用来关联这两张表,具体操作如下:
4.1.在数据库db_gm中新增一张tb_user_role的表
4.2.在新表中添加所需数据
完成这步后,就可以回到项目中进行下一步操作。
5.在UserInfo实体类中追加一个roleList的属性,并实现其get/set方法
6.在dao层中我们编写一个根据用户ID去查询role角色的抽象方法
7.在RoleMapper.xml文件中定义相关SQL语句
8.接下来在service层中进行如下操作
8.1.继承UserDetailsService这一类
8.2.实现继承类中的方法
9.之后我们找到controller层中的登陆方法并将其注释,另外将之前所写的拦截器和过滤器也都注释掉,不然会影响后期的测试。最后我们进入我们的login.jsp页面做相关修改
将我们之前所写的/user/doLogin.do改为/login.do即可
10.由于将之前所写的登陆方法注释了,所以页面不会显示当前用户登陆信息,不过我们可以使用SpringSecurity的专有标签去实现,不过在此之前需要将
<%@taglibprefix="security"uri=“http://www.springframework.org/security/tags” %>这个头文件添加到我们的aside.jsp的头标签下面才可使用我们的SpringSecurity的专有标签。
11.编写权限管理的标签,使得管理员登陆可以查看用户管理的内容,普通用户登陆则不可以查看用户管理的内容。
12.最后一步,在web.xml文件中加载我们新加入的Spring-security.xml配置文件
13.测试
13.1.管理员登陆:
13.2.普通用户登陆:
至此,权限框架Spring-Security完成!