04.AdminLTE的基本介绍

05.SSM整合案例的基本介绍

06.产品操作

07.订单操作

08.权限控制

09.用户和角色操作

10.权限关联

11.AOP日志

09.用户和角色操作


1. 用户操作-查询所有用户

3.3.1.用户查询页面 user-list.jsp
 请在资料中查看具体代码

                            <!--数据列表-->
<table id="dataList"
class="table table-bordered table-striped table-hover dataTable">
<thead>
<tr>
<th class="" style="padding-right: 0px"><input
id="selall" type="checkbox" class="icheckbox_square-blue">
</th>
<th class="sorting_asc">ID</th>
<th class="sorting_desc">用户名</th>
<th class="sorting_asc sorting_asc_disabled">邮箱</th>
<th class="sorting_desc sorting_desc_disabled">联系电话</th>
<th class="sorting">状态</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody> <c:forEach items="${userList}" var="user" varStatus="s">
<tr>
<td><input name="ids" type="checkbox" id="${s.index}" value="${user.id}"></td>
<td>${user.id }</td>
<td>${user.username }</td>
<td>${user.email }</td>
<td>${user.phoneNum }</td>
<td>${user.statusStr }</td>
<td class="text-center">
<a href="${pageContext.request.contextPath}/user/findById.do?id=${user.id}" class="btn bg-olive btn-xs">详情</a>
<a href="${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id=${user.id}" class="btn bg-olive btn-xs">添加角色</a>
</td>
</tr>
</c:forEach>
</tbody>

视图层  UserController

@Controller
@RequestMapping(value = "/user")
public class UsersController { @Autowired
private IUserService userService; @RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception{ ModelAndView mv = new ModelAndView("user-list2");
//获取一个添加对象
List<UserInfo> userList = userService.findAll();
//attributeName取决于jsp页面上的EL表达式{}里面的字符串
mv.addObject("userList",userList);
return mv;
} }

UserServiceImpl

新添加的部分代码:

    // 查询所有用户
@Override
public List<UserInfo> findAll() throws Exception {
return userDao.findAll();
}

持久层 IUserDao

新添加的部分代码:

    /**
* 查询所有用户
* @return
* @throws Exception
*/
@Select("select * from USERS")
public List<UserInfo> findAll() throws Exception;

user-list.jsp里面的一个按钮控件通过onclick 实现跳转请求

                            <!--工具栏-->
<div class="pull-left">
<div class="form-group form-inline">
<div class="btn-group">
<button type="button" class="btn btn-default" title="新建" onclick="location.href='${pageContext.request.contextPath}/pages/user-add.jsp'">
<i class="fa fa-file-o"></i> 新建
</button> <button type="button" class="btn btn-default" title="刷新">
<i class="fa fa-refresh"></i> 刷新
</button>
</div>
</div>
</div>

user-add.jsp里面关键信息如下:

form表单的action属性

            <!-- 内容头部 /-->

            <form action="${pageContext.request.contextPath}/user/save.do"
method="post">
<!-- 正文区域 -->

3.4 用户添加

DAO层

    /**
* 添加一个新用户
* @param userInfo
*/
@Insert({"insert into USERS(username,email,password,phoneNum,status)",
"values(#{username},#{email},#{password},#{phoneNum},#{status})"})
public void save(UserInfo userInfo) throws Exception;

Utils工具类

package cn.bjut.ssm.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class BCryptPasswordEncoderUtils {

    private static BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
//工具类的方法最好用static关键字修饰
//明文转换成密文工具类
public static String encodePassword(String password){ return bCryptPasswordEncoder.encode(password);
}
}

Service层

    //添加一个新用户
@Override
public void save(UserInfo userInfo) throws Exception {
//对密码进行加密处理
userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
userDao.save(userInfo);
//返回void
return ;
}

Controller层

    //添加用户(后自动请求查询所有用户)
@RequestMapping("/save.do")
public String save(UserInfo userInfo)throws Exception{
userService.save(userInfo);
//返回字符串为当前控制类的注解@RequestMapping后面小括号里的内容
return "redirect:findAll.do";
}

修改oracle数据库中表的varchar2字段类型长度

package cn.bjut.ssm.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class BCryptPasswordEncoderUtils {

    private static BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
//工具类的方法最好用static关键字修饰
//明文转换成密文工具类
public static String encodePassword(String password){ return bCryptPasswordEncoder.encode(password);
} //构造一个主方法用于转换之前明文密码获得加密后的字符串
public static void main(String[] args) { //之前明文密码:itheima
//$2a$10$ylUiLsD7W.hqjGIsND9/CeuKRxz4.4oHsyZulKtfErHzL5WAkOqtW
String code = BCryptPasswordEncoderUtils.encodePassword("itheima");
//打印到控制台
System.out.println(code); }
}
-- 查询表users的数据
select * from users t;
-- 插入之前的明文密码的转换字符串密文
update USERS set PASSWORD ='$2a$10$ylUiLsD7W.hqjGIsND9/CeuKRxz4.4oHsyZulKtfErHzL5WAkOqtW'
where USERNAME = 'ssm08';
-- 提交事务
commit;

spring-security.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="/images/**" security="none"/>
<security:http pattern="/plugins/**" security="none"/> <!--
配置具体的规则
auto-config="false" 选用自己编写登录的页面,不用框架提供的默认登录页面
use-expressions="false" 是否使用SPEL表达式(还没学习过)
-->
<security:http auto-config="false" use-expressions="true" >
<!-- 配置具体的拦截的规则 pattern="请求路径的规则" access="访问系统的人,必须有ROLE_USER的角色" -->
<security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
<!--<security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>--> <!--如果没有login-processing-url这一属性,那么登录表单的action,必须为j_spring_secutity_check-->
<!-- 定义跳转的具体的页面 -->
<security:form-login
login-page="/login.jsp"
login-processing-url="/login"
username-parameter="username" password-parameter="password"
default-target-url="/index.jsp"
authentication-failure-url="/failer.jsp"
authentication-success-forward-url="/index.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>

Service层的 实现了接口UserDetailsService的实现类

cn.bjut.ssm.service.impl.UserServiceImpl

@Service(value = "userService")
@Transactional //注解的方式使用spring事务管理
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao; @Autowired //注入加密类
private BCryptPasswordEncoder bCryptPasswordEncoder; @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//UserInfo是domain包下的实体类
UserInfo userInfo = null; try{
userInfo = userDao.findByUsername(username);
} catch(Exception e){
e.printStackTrace();
} //把自己查询到的实体类中的认证信息封装成UserDetails
//"{noop}"使用密码明文的必要前缀 // User user = new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),getAuthority(userInfo.getRoles()));
User user = new User(userInfo.getUsername(),userInfo.getPassword(),userInfo.getStatus() ==0 ?false:true,true,true,true,getAuthority(userInfo.getRoles())); return user; } //这个成员方法作用就是返回一个List集合,集合中装入的是角色描述。
//实际项目中应该是从数据库中获取role描述后封装到这个方法体里面。
public List<SimpleGrantedAuthority> getAuthority(List<Role> roles){ List<SimpleGrantedAuthority> list = new ArrayList<>(); //增强for循环
for (Role role :roles){
// new 匿名对象
list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
} return list;
} // 查询所有用户
@Override
public List<UserInfo> findAll() throws Exception {
return userDao.findAll();
} //添加一个新用户
@Override
public void save(UserInfo userInfo) throws Exception {
//对密码进行加密处理
userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
userDao.save(userInfo);
//返回void
return ;
} }

6.用户操作-用户详情服务器端代码实现

user-list.jsp

                                                <a href="${pageContext.request.contextPath}/user/findById.do?id=${user.id}" class="btn bg-olive btn-xs">详情</a>
<a href="${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id=${user.id}" class="btn bg-olive btn-xs">添加角色</a>
</td>

详情 按钮可以向服务器提交一个GET方式的请求。


视图层

@Controller
@RequestMapping(value = "/user")
public class UsersController { @Autowired
private IUserService userService; @RequestMapping("/findById.do")
public ModelAndView findById(String id)throws Exception{ ModelAndView mv = new ModelAndView();
//获取一个Object
UserInfo userInfo = userService.findById(id);
mv.addObject("user",userInfo);
mv.setViewName("user-show2");
return mv;
}

Service层

@Service(value = "userService")
@Transactional //注解的方式使用spring事务管理
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao; @Autowired //注入加密类
private BCryptPasswordEncoder bCryptPasswordEncoder; @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//UserInfo是domain包下的实体类
UserInfo userInfo = null; try{
userInfo = userDao.findByUsername(username);
} catch(Exception e){
e.printStackTrace();
} //把自己查询到的实体类中的认证信息封装成UserDetails
//"{noop}"使用密码明文的必要前缀 // User user = new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),getAuthority(userInfo.getRoles()));
User user = new User(userInfo.getUsername(),userInfo.getPassword(),userInfo.getStatus() ==0 ?false:true,true,true,true,getAuthority(userInfo.getRoles())); return user; } //这个成员方法作用就是返回一个List集合,集合中装入的是角色描述。
//实际项目中应该是从数据库中获取role描述后封装到这个方法体里面。
public List<SimpleGrantedAuthority> getAuthority(List<Role> roles){ List<SimpleGrantedAuthority> list = new ArrayList<>(); //增强for循环
for (Role role :roles){
// new 匿名对象
list.add(new SimpleGrantedAuthority("ROLE_"+role.getRoleName()));
} return list;
} // 查询所有用户
@Override
public List<UserInfo> findAll() throws Exception {
return userDao.findAll();
} //添加一个新用户
@Override
public void save(UserInfo userInfo) throws Exception {
//对密码进行加密处理
userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword()));
userDao.save(userInfo);
//返回void
return ;
} //通过ID查询用户详情
@Override
public UserInfo findById(String id) throws Exception{ return userDao.findByUserId(id);
} }

IUserDAO

    //通过用户ID查询Role的详情
@Select("select id,username,phoneNum,status from USERS where id = #{ UserId }")
@Results({
@Result(property = "id",column = "id",id = true),
@Result(property = "username",column = "username"),
@Result(property = "phoneNum",column = "phoneNum"),
@Result(property = "status",column = "status"),
//通过中间表查询多对多关系,返回一个其它实体类的List集合
@Result(property = "roles",column = "id",javaType =java.util.List.class,many = @Many(select = "cn.bjut.ssm.dao.IRoleDao.findRoleByUserId"))
})
public UserInfo findByUserId(String UserId) throws Exception;

IRoleDao

public interface IRoleDao {
//根据用户ID查询出所有对应的角色
@Select("select * from ROLE where id in( select ROLEID from USERS_ROLE where USERID = #{userId})")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "roleName",column = "roleName"),
@Result(property = "roleDesc",column = "roleDesc"), @Result(property = "permissions",column = "id",javaType = java.util.List.class,many = @Many(select = "cn.bjut.ssm.dao.IPermissionDao.findPermissionByRoleId"))
}) public List<Role> findRoleByUserId(String userId) throws Exception; }

IPermissionDao

public interface IPermissionDao {

    //多对多表的查询,先查询中间表作为结果集。
@Select("select * from PERMISSION where id in(select permissionId from role_permission where roleId = #{ roleId})")
public List<Permission> findPermissionByRoleId(String roleId) throws Exception;
}

user-show.jsp

                        <!--数据列表-->
<div class="tab-pane" id="tab-treetable">
<table id="collapse-table"
class="table table-bordered table-hover dataTable">
<thead>
<tr>
<th>名称</th>
<th>描述</th>
</tr>
</thead> <tr data-tt-id="0">
<td colspan="2">${user.username}</td>
</tr> <tbody>
<c:forEach items="${user.roles}" var="role" varStatus="s">
<tr data-tt-id="${s.index +1 }" data-tt-parent-id="0" >
<td>${role.roleName }</td>
<td>${role.roleDesc }</td>
</tr>
<c:forEach items="${role.permissions}" var="permission">
<tr data-tt-id="1-1" data-tt-parent-id="${s.index +1 }">
<td>${permission.permissionName}</td>
<td>${permission.url}</td>
</tr> </c:forEach>
</c:forEach>
</tbody>
</table>
</div>
<!--数据列表/-->

9.角色操作-查询所有角色

在aside.jsp文件内有侧边栏导航的链接地址,这些就是Controller层的@RequestMapping注解后面的value值。

ssm_web子模块新建一个RoleController实现。

DAO层  IRoleDao

    @Select("select * from ROLE ")
@Results({
@Result(id = true,property = "id",column = "id"),
@Result(property = "roleName",column = "roleName"),
@Result(property = "roleDesc",column = "roleDesc"),
})
//查询所有的Role信息返回一个List集合
public List<Role> findAll()throws Exception;

Service层  RoleServiceImpl

@Service
@Transactional //注解的方式使用spring事务管理
public class RoleServiceImpl implements IRoleService { @Autowired
private IRoleDao roleDao;
//查询所有Role的Service层实现
@Override
public List<Role> findAll() throws Exception {
return roleDao.findAll();
}
}

视图层  RoleController

/**
* 角色管理Controller
*/
@Controller
@RequestMapping(name ="/role")
public class RoleController { @Autowired
private IRoleService roleService;
//查询所有角色
@RequestMapping ("/findAll.do")
public ModelAndView findAll() throws Exception{
ModelAndView mv = new ModelAndView();
List<Role> roleList = roleService.findAll();
mv.addObject("roleList",roleList);
mv.setViewName("role-list2");
return mv; }
}

@RequestMapping (value="{

       } ")  可以支持通配符* 的请求路径的数组。

Controller层

/**
* 角色管理Controller
*/
@Controller
@RequestMapping("/role")
public class RoleController { @Autowired
private IRoleService roleService;
//新建保存一个Role
@RequestMapping(value = {
"/save.do"
})
public String saveRole(Role role) throws Exception{ roleService.saveRole( role);
return "redirect:findAll.do";
}

DAO层

public interface IRoleDao {

    //插入一条Role完整信息
@Insert({"insert into ROLE (roleName,roleDesc) ",
"values(#{roleName},#{roleDesc})"})
public void saveRole(Role role)throws Exception;

PL/SQL Developer插入两条PERMISSION表的数据以供后续测试使用。

-- 查询PERMISSION表中所有数据
select * from permission t -- 添加两条测试记录到PERMISSION表
insert into permission ( permissionname, URL ) values('user findAll','/user/findAll.do');
insert into permission ( permissionname, URL ) values('user findByID','/user/findById.do');
commit;

在WEB-INF/pages/目录下copy一份 permission-list.jsp作为前端显示的页面。

@Controller
@RequestMapping(value="/permission")
public class PermissionController {
@Autowired
private IPermissionService permissionService; @RequestMapping("/findAll.do")
public ModelAndView findAll() throws Exception{ ModelAndView mv = new ModelAndView();
List<Permission> permissionList = permissionService.findAll();
mv.addObject("permissionList",permissionList);
mv.setViewName("permission-list2");
return mv;
} }

DAO层的接口 IPermissionDao

public interface IPermissionDao {

    //查询所有权限
@Select("select * from PERMISSION")
public List<Permission> findAll() throws Exception;

====================

end

08 SSM整合案例(企业权限管理系统):09.用户和角色操作的更多相关文章

  1. 08 SSM整合案例(企业权限管理系统):05.SSM整合案例的基本介绍

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 05.SSM整合案例的基本介绍 ...

  2. 08 SSM整合案例(企业权限管理系统):11.AOP日志

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 11.AOP日志 1.数据库与 ...

  3. SSM整合案例:图书管理系统

    目录 SSM整合案例:图书管理系统 1.搭建数据库环境 2.基本环境搭建 2.1.新建一个Maven项目,起名为:ssmbuild,添加web的支持 2.2.导入pom的相关依赖 2.3.Maven静 ...

  4. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(27)-权限管理系统-分配用户给角色 分配用户给角色,跟分配角色给用户操作是基本一致的. 打开模块维护,展 ...

  5. 08 SSM整合案例(企业权限管理系统):07.订单操作

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.用户操作 09.权限控制 10.权限关联与控制 11.AOP日志 07.订单操作 SSM订单操作 ...

  6. 08 SSM整合案例(企业权限管理系统):06.产品操作

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.用户操作 09.权限控制 10.权限关联与控制 11.AOP日志 06.产品操作 SSM 环境搭 ...

  7. 08 SSM整合案例(企业权限管理系统):08.权限控制

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 08.权限控制 SSM权限操作 ...

  8. 08 SSM整合案例(企业权限管理系统):10.权限关联与控制

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户操作 10.权限关联与控制 11.AOP日志 10.权限关联与控制 1.用户 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(27)-权限管理系统-分配用户给角色

    系列目录 分配用户给角色,跟分配角色给用户操作是基本一致的. 打开模块维护,展开SysRole模块添加一个操作码,并赋予权限 设置好之后将权限授权给管理员,在SysRole的index添加操作码与js ...

随机推荐

  1. cin和cout输⼊输出

    写再最前面:摘录于柳神的笔记:  就如同 scanf 和 printf 在 stdio.h 头⽂件中⼀样, cin 和 cout 在头⽂件 iostream ⾥⾯,看名字就知 道, io 是输⼊输出 ...

  2. [经验] Unity3D 里怎么制作天空盒(skybox)

    记载一个简单的  天空盒子  的制作方法 第一步: 在 assets 文件夹下新建一个文件夹, 随便取个名字, 不过最好是用来专门管理场景游戏对象的文件夹,    例如放在这个 Skybox 里:  ...

  3. Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)

    八:事件(Event()) # 阻塞事件:    e = Event() 生成事件对象e    e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...

  4. esxi虚拟机无法开机,提示“没有更多空间可供虚拟磁盘server-000001.vmdk使用。也许通过释放相关卷上的磁盘空间并单击 重试 继续此会话,单击 取消 可终止此会话”

    背景:esxi安装在32G的U盘上,硬盘总大小:1.64T,虚拟机A占用:600GB,虚拟机B占用:900GB.所以还有剩余不到200G左右. 原因是宿主机硬盘空间不足.通过图中可以看出空间已经只剩2 ...

  5. 《iOS开发进阶》书籍目录

    第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经 ...

  6. MacBook OSX VMWare Fusion 11安装 Tools For Windows

    需要加载对应客户机系统的安装文件,可以在/Applications/VMware\ Fusion.app/Contents/Library/isoimages文件夹下找到: 设置虚拟机的光驱: 在虚拟 ...

  7. Altium Designer中,将多个工程下的原理图和PCB合并在一起

    TDD双向放大器的设计分为三部分:LNA部分.PA部分和控制开关部分.为了调试方便,已经在三个Altium工程里面分别设计了三部分.现在需要合并成一个板子,为了保留已有的布局布线的工作量,采用这个办法 ...

  8. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  9. cover-view子节点溢出父节点被剪切的问题

    因为之前在使用自定义tabbar的时候,使用了cover-view, 导致溢出父节点的那部分被剪切掉,因为没找到有类似的问题出现, 所以我在布局方面做了调整: .tab-bar { overflowY ...

  10. Vmware tools变灰不能点击的问题

    1. 挂载镜像文件,虚拟机->设置->硬件->CD/DVD.右边“连接”下面选择“使用IOS镜像文件”,浏览选择虚拟机包目录下面linux.iso 2. 挂载成功后,在虚拟机右下角c ...