用户管理模块
github完整项目地址:
https://github.com/lindaifeng/Authority-Management-System
项目首页地址:
https://blog.csdn.net/weixin_45019350/article/details/107418838
一、Spring Security介绍
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。(https://projects.spring.io/spring-security/)
Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发的企业软件项目。人们使用SpringSecurity有很多种原因,不过通常吸引他们的是在J2EE Servlet规范或EJB规范中找不到典型企业应用场景的解决方案。 特别要指出的是他们不能再WAR 或 EAR 级别进行移植。这样,如果你更换服务器环境,就要,在新的目标环境进行大量的工作,对你的应用系统进行重新配 置安全。使用Spring Security 解决了这些问题,也为你提供很多有用的,完全可以指定的其他安全特性。 安全包括两个主要操作。
“认证”,是为用户建立一个他所声明的主体。主题一般式指用户,设备或可以在你系 统中执行动作的其他系
统。
“授权”指的是一个用户能否在你的应用中执行某个操作,在到达授权判断之前,身份的主题已经由 身份验证过程建立了。
1、Spring Securityl配置
拦截所有页面(判断用户登录操作,每次用户登录时都会被拦截判断用户名密码是否正确,访问是否有权限)
2.Spring Securityl 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">
<!-- 配置不拦截的资源 -->
<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"/>
<!-- 在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制。Spring Security在方法的权限控制上
支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启用的,需要
单独通过global-method-security元素的对应属性进行启用-->
<security:global-method-security secured-annotations="enabled"/> <!--在方法前加上该注解就可以@Secured("ROLE_USER")-->
<!-- <security:global-method-security pre-post-annotations="disabled"/>-->
<!-- <security:global-method-security jsr250-annotations="disabled"/>-->
<!--
配置具体的规则
auto-config="true" 不用自己编写登录的页面,框架提供默认登录页面
use-expressions="false" 是否使用SPEL表达式(没学习过)
-->
<security:http auto-config="true" use-expressions="false">
<!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" -->
<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN,ROLE_King"/>
<!-- 定义跳转的具体的页面 -->
<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:logout invalidate-session="true" logout-url="/logout.do" logout-success-url="/login.jsp" />
</security:http>
<!-- 切换成数据库中的用户名和密码 -->
<security:authentication-manager>
<security:authentication-provider user-service-ref="userService">
<!-- 配置加密的方式-->
<security:password-encoder ref="passwordEncoder"/>
</security:authentication-provider>
</security:authentication-manager>
<!-- 配置加密类 -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
<!-- 提供了入门的方式,在内存中存入用户名和密码
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="admin" password="{noop}admin" authorities="ROLE_USER"/>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
-->
</beans>
3.Spring Security使用数据库认证
在Spring Security中如果想要使用数据进行认证操作,有很多种操作方式,这里我使用UserDetails、UserDetailsService来完成操作。
继承IUserService并实现loadUserByUsername方法
判断用户登录操作
1.用户在页面输入用户名密码
2.spring security拦截 springsecurity.xml根据配置规则作出相应的反应,首先会拿到用户名密码,调用service层
3.service层获取用户名调用dao层去数据库查找密码和用户关联的角色,返回回来角色可能关联了多个所以需要进行遍历封装后,在将用户名密码和角色等封装带UserDetails的实体类User中返回给springseecurity进行用户名,密码解密检验,和角色校验,校验通过放行(注意配置规则前角色前加了ROLE_ ,封装角色前也要加上)
想要扩展还可以加上是否过期,是否锁定等操作
4.密码加密(放开这两段代码可实现加密)
Spring Security提供的BCryptPasswordEncoder可以帮我们进行加密操作
写一个加密工具类,可自己设置密码后查看加密后的密码
二、用户查询
(做了分页功能和搜索功能,前文商品模块中有讲过)
商品模块地址:https://blog.csdn.net/weixin_45019350/article/details/107427721
三、用户详情
涉及到角色查询和多表关系的操作(可看下文)
角色模块地址:
https://blog.csdn.net/weixin_45019350/article/details/107428970
用户和角色是多对多的关系,所以我们用一张中间表连接
调用两个方法根据用户id分别查询出对应的用户和关联的角色(并根据角色id查询出所关联的资源权限) 和用户没有关联的角色
查询出对应的用户和关联的角色
并根据角色id查询出关联的资源权限
查询出用户没有关联的角色
四、添加角色
传入用户id和角色id
调用业务层方法传日用户id和角色id,业务层调用持久层往数据库用户_角色关联表中关联两个id,返回后调用查询方法查询指定用户关联的角色和下面没有关联的角色(做刷新操作)
五、删除角色
实际删除的是用户与角色之间的关联(并非删除角色)
只需要根据用户id和角色id删除关联表中对应的数据即可(一定是要传两个id)
再做查询操作(刷新)