3.用户登陆-用户加密-用户与角色

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3.用户登陆-用户加密-用户与角色相关的知识,希望对你有一定的参考价值。


一、用户模块

3.用户登陆-用户加密-用户与角色_数组

1.用户名称获取


1.分析用户存储位置为securityContext---authentication---principal对象中
//后台获取权限框架存储的用户对象
SecurityContext context = SecurityContextHolder.getContext();
User user = (User) context.getAuthentication().getPrincipal();
System.out.println(user.getUsername());
2.jsp页面获取方式
原始session域中获取
通过权限框架标签获取
$SPRING_SECURITY_CONTEXT.authentication.principal.username
<security:authentication property="principal.username"></security:authentication>


2.用户的退出功能实现


需求:请求退出 清空session 并且跳转到login.jsp
<!--配置退出请求的过滤器节点
logout-url="/logout" 注销按钮点击请求的url路径
logout-success-url="/login.jsp" 注销成功跳转登录页
-->
<security:logout logout-url="/logout"
logout-success-url="/login.jsp"
invalidate-session="true"></security:logout>
header.jsp更改请求路径即可
<div class="pull-right">
<a href="$pageContext.request.contextPath/logout"
class="btn btn-default btn-flat">注销</a>
</div>


3.用户的列表查询

4.用户的添加功能

3.用户登陆-用户加密-用户与角色_数组_02


1.点击跳转添加用户页面

2.点击保存提交用户信息

3.用户密码加密存储 采用框架提取的BCryptePasswordEncoder类
security.xml文件 初始化加密类对象
<bean id="pwdEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
------------------------------------------------------------
userService实现类 属性注入对象
@Autowired
BCryptPasswordEncoder pwdEncoder;
--------------------------------------------------------------------
保存用户的方法
@Override
public void saveUser(SysUser user)
//将接受的明文密码加密后保存
String pwd = user.getPassword();
user.setPassword(pwdEncoder.encode(pwd));
userDao.saveUser(user);

4.密文方式验证登录
security.xml文件中配置 使用的加密类
<security:authentication-provider user-service-ref="userService">
<!--指定框架应用的加密类
<security:password-encoder ref="pwdEncoder"></security:password-encoder>
-->
<security:password-encoder hash="bcrypt"></security:password-encoder>
</security:authentication-provider>
---------------------------
userService实现类 去掉 noop 表示密文验证
//密码验证
User user = new User(sysUser.getUsername(),sysUser.getPassword(),authorities);


二、角色模块

初始化表结构

3.用户登陆-用户加密-用户与角色_ide_03


系统的角色表
CREATE TABLE sys_role(
id NUMBER(9) PRIMARY KEY,
roleName VARCHAR2(50) ,
roleDesc VARCHAR2(50)
)
角色和权限中间表
CREATE TABLE sys_user_role(
userId NUMBER(9),
roleId NUMBER(9),
PRIMARY KEY(userId,roleId),
FOREIGN KEY (userId) REFERENCES sys_USER(id),
FOREIGN KEY (roleId) REFERENCES sys_role(id)
)


1.角色的列表

2.角色的添加

3.用户和角色的关系维护

3.用户登陆-用户加密-用户与角色_el表达式_04


--------------------数据回显的实现
1.点击管理角色 传递参数为userId
<a href="$pageContext.request.contextPath/user/managerUserRoleUI?id=$user.id" class="btn bg-olive btn-xs">管理角色</a>
2.controller动作类接受请求 返回三种数据
@RequestMapping("/managerUserRoleUI")
public String managerUserRoleUI(Integer id,Model model)
//获取用户的信息
SysUser user = userService.findUserById(id);
//通过user对象获取所有的角色列表
List<SysRole> userRoles = user.getRoles();
//将所有的角色信息拼装成一个角色字符串用于页面的包含判断
if(userRoles!=null&&userRoles.size()>0)
StringBuilder sb = new StringBuilder();
for (SysRole userRole : userRoles)
sb.append(userRole.getRoleName()+",");

model.addAttribute("rStr",sb.toString());

//所有的角色数据
List<SysRole> roles = roleService.findAllRole();
model.addAttribute("user",user);

model.addAttribute("roles",roles);
return "user/managerUserRole";

3.jsp页面el表达式 获取用户名
el表达式 获取所有角色 循环显示
el表达式 获取角色字符串判断 回显复选框选中
1.引入支持函数的标签
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
2.函数的包含方法判断
<c:if test="$fn:contains(rStr,role.roleName )">checked</c:if>
-----------点击保存管理用户的角色----------------------------------
1.表单内多个标签 name属性一致 value值不一致 是通过数组方式传递
保证多个角色id传递到后台服务器 通过数组形式
<td><input name="ids" type="checkbox" <c:if test="$fn:contains(rStr,role.roleName )">checked</c:if> value="$role.id"></td>
保证被管理的userid传递
<input type="hidden" name="userId" value="$user.id">
多个角色id维护关系逻辑为 先删除再添加
public void managerUserRole(Integer userId, Integer[] ids)
//先根据用户id删除原始角色
userDao.removeRoleFromUser(userId);
//添加角色
if(ids!=null&&ids.length>0)
for (Integer rid : ids)
userDao.saveUserRole(userId,rid);




4.获取用户真实角色验证登录


1.更改userService实现类 登录时候获取这是的角色
List<SysRole> userRoles = sysUser.getRoles();
if(userRoles!=null&&userRoles.size()>0)
for (SysRole userRole : userRoles)
authorities.add(new SimpleGrantedAuthority(userRole.getRoleName()));


2.修改security的配置文件支持多个角色验证登录
<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ORDER,ROLE_PRODUCT,ROLE_ADMIN"></security:intercept-url>


 

以上是关于3.用户登陆-用户加密-用户与角色的主要内容,如果未能解决你的问题,请参考以下文章

MD5加密在用户注册时和用户登陆时怎么用?还有效验接收的文件时的问题

Oracle 说明用户、权限和角色的关系,以及用户权限的管理有哪些?

Xadmin权限管理

Gitlab的用户组权限的分配与管理管理

如何保证用户登陆时提交密码已经加密

IUAP--单点登录