一、认识Spring-Security

1.概念:

springsecurity expires_in设置_java


概述: Spring-Security

Spring中提供安全认证服务的框架

认证:验证用户密码是否正确的过程

授权:对用户能访问的资源进行控制

https://mvnrepository.com/

SpringSecurity是Spring提供的一个安全框架,提供认证和授权功能,最主要的是它提供了简单的使用方式,同时又有很高的灵活性,简单,灵活,强大。

2.SpringSecurity 流程图:

springsecurity expires_in设置_xml文件_02


流程说明:

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的过滤器

springsecurity expires_in设置_java_03


3.配置Spring-security.xml文件

springsecurity expires_in设置_spring_04


在这里需要说明的是,在上面的43行代码中可能会出现错误,但是不要再此做修改,这是固定写法,只需要在你的service层下的实现类中修改为@Service(“userService”)就可以了。

4.对数据库中的表做相关操作

针对于我的项目,我的有关需求是把当前user表和 role 表关联起来,实现一对多的关系,这就需要我在数据库中新增一张表用来关联这两张表,具体操作如下:

4.1.在数据库db_gm中新增一张tb_user_role的表

springsecurity expires_in设置_xml文件_05


4.2.在新表中添加所需数据

springsecurity expires_in设置_spring_06


完成这步后,就可以回到项目中进行下一步操作。

5.在UserInfo实体类中追加一个roleList的属性,并实现其get/set方法

springsecurity expires_in设置_数据库_07


6.在dao层中我们编写一个根据用户ID去查询role角色的抽象方法

springsecurity expires_in设置_xml文件_08


7.在RoleMapper.xml文件中定义相关SQL语句

springsecurity expires_in设置_数据库_09


8.接下来在service层中进行如下操作

8.1.继承UserDetailsService这一类

springsecurity expires_in设置_数据库_10


8.2.实现继承类中的方法

springsecurity expires_in设置_数据库_11


9.之后我们找到controller层中的登陆方法并将其注释,另外将之前所写的拦截器和过滤器也都注释掉,不然会影响后期的测试。最后我们进入我们的login.jsp页面做相关修改

springsecurity expires_in设置_java_12


将我们之前所写的/user/doLogin.do改为/login.do即可

10.由于将之前所写的登陆方法注释了,所以页面不会显示当前用户登陆信息,不过我们可以使用SpringSecurity的专有标签去实现,不过在此之前需要将
<%@taglibprefix="security"uri=“http://www.springframework.org/security/tags” %>这个头文件添加到我们的aside.jsp的头标签下面才可使用我们的SpringSecurity的专有标签。

springsecurity expires_in设置_xml文件_13


11.编写权限管理的标签,使得管理员登陆可以查看用户管理的内容,普通用户登陆则不可以查看用户管理的内容。

springsecurity expires_in设置_数据库_14


12.最后一步,在web.xml文件中加载我们新加入的Spring-security.xml配置文件

springsecurity expires_in设置_java_15


13.测试

13.1.管理员登陆:

springsecurity expires_in设置_数据库_16


13.2.普通用户登陆:

springsecurity expires_in设置_数据库_17


至此,权限框架Spring-Security完成!