一、用户模块
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>