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.用户的添加功能

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);

二、角色模块

初始化表结构

系统的角色表
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.用户和角色的关系维护

--------------------数据回显的实现
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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值