04.AdminLTE的基本介绍

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

06.产品操作

07.订单操作

08.权限控制

09.用户操作

10.权限关联与控制

11.AOP日志

10.权限关联与控制


1.用户关联角色操作-流程分析

项目运行的网络环境发生变化后,实际上就是我笔记本电脑 所连接到的路由器发生变更。需要用cmd下的ipconfig命令查看当前主机IP地址,然后去web子模块项目的resources目录下把jdbc.properties配置文件的

jdbc.url=jdbc:oracle:thin:@192.168.0.108:1521:orcl     做修改后重新install一下WEB项目再测试就跑通了。

2.用户关联角色操作 

视图层的UsersControler

    //查询用户以及可以添加的角色
@RequestMapping("/findUserByIdAndAllRole.do")
public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id") String userId)throws Exception{
ModelAndView mv = new ModelAndView();
//1.根据一个用户ID查询结果
UserInfo userInfo = userService.findById(userId);
//2.根据用户ID查询可以添加的角色
List<Role> othersRoles = userService.findOthersRoles(userId);
mv.addObject("user",userInfo);
mv.addObject("rolesList",othersRoles);
mv.setViewName("user-role-add2");
return mv;
}

DAO层的 IUserDao

    // where not in ()
@Select("select * from role where id not in (select roleId from users_role where userId = #{userId}) ")
List<Role> findOthersRoles(String userId);

视图层的UsersControler

    //给用户添加选定的角色
@RequestMapping("/addRoleToUser.do")
public String addRoleToUser(@RequestParam(name = "userId") String userId,@RequestParam(name = "ids") String[] roleIds ) throws Exception { userService.addRoleToUser(userId, roleIds);
return "redirect:findAll.do";
}

Service层的接口实现类

    //通过ID查询用户详情
@Override
public UserInfo findById(String id) throws Exception{ return userDao.findByUserId(id);
}
//通过用户ID查询其他可以添加的角色
@Override
public List<Role> findOthersRoles(String userId) throws Exception { return userDao.findOthersRoles(userId); } /**
* 给用户添加选定角色
*
* @param userId
* @param roleIds
*/
@Override
public void addRoleToUser(String userId, String[] roleIds) throws Exception{ for (String roleId:roleIds
) {
userDao.addRoleToUser(userId,roleId);
}
}

DAO层的接口代码

    //插入用户的新角色DAO层实现
//mybatis的@Param注解给接口方法形参指定匹配的#{name}
@Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId);

DAO层 IRoleDAO

    //1.通过roleID查询Role当前已有的权限
@Select("select * from ROLE where Id = #{roleId}")
Role findByRoleId(String roleId) throws Exception; //1.先根据角色ID查询中间表role_permission中已有的权限ID
//2.再去取权限表中取已有的权限ID集合的补集
@Select("select * from PERMISSION where id not in(select permissionId from ROLE_PERMISSION where roleId = #{roleId})")
List<Permission> findOthersPermissoinByRoleId(String roleId)throws Exception; //插入角色Role的新权限DAO层实现
//mybatis的@Param注解给接口方法形参指定匹配的#{name}
@Insert("insert into ROLE_PERMISSION (roleId,permissionId) values(#{roleId},#{permissionId})")
void addPermissionToRole(@Param("roleId") String roleId,@Param("permissionId") String permissionId)throws Exception;

Service层  接口实现类

    //1.查询已有的权限根据角色ID
@Override
public Role findByRoleId(String roleId) throws Exception {
return roleDao.findByRoleId(roleId);
}
//2.通过角色ID查询其它可以添加的权限
@Override
public List<Permission> findOthersPermissoin(String roleId) throws Exception{
return roleDao.findOthersPermissoinByRoleId(roleId);
}
/**
* 3.给角色添加还没有的权限
*/
@Override
public void addPermissionToRole(String roleId, String[] permissionsId) throws Exception { for (String permissionId:permissionsId
) {
roleDao.addPermissionToRole(roleId,permissionId);
} }

Controller层

    //2.查询角色还没拥有的权限
@RequestMapping("/findRoleByIdAndAllPermission.do")
public ModelAndView findUserByIdAndAllRole(@RequestParam(name = "id") String roleId)throws Exception{
ModelAndView mv = new ModelAndView();
//1.根据一个roleID查询Role结果
Role role = roleService.findByRoleId(roleId);
//2.根据角色ID查询可以添加的权限
List<Permission> otherPermissions = roleService.findOthersPermissoin(roleId);
mv.addObject("role",role);
mv.addObject("permissionList",otherPermissions);
mv.setViewName("role-permission-add2");
return mv;
} //3.给角色添加未拥有的权限
@RequestMapping("/addPermissionToRole.do")
public String addPermissionToRole(@RequestParam(name = "roleId") String roleId,@RequestParam(name = "ids") String[] permissionsId) throws Exception{
roleService.addPermissionToRole(roleId,permissionsId);
return "redirect:findAll.do";
}

7.方法级别权限控制--JSR250注解的使用

pom.xml导入依赖坐标

        <dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>

1、在web项目子模块的 spring-security.xml中添加以下配置信息:

    <!-- 开启JSR-250注解支持 -->
<security:global-method-security jsr250-annotations="enabled"/>

2、在指定的视图层的Controller方法上使用 @RolesAllowed("ADMIN")

    //添加产品(后跳转查询产品)
@RequestMapping("/save.do")
//添加JSR-250注解权限控制
@RolesAllowed("ADMIN")
public String save(Product product)throws Exception{
productService.save(product);
return "redirect:findAll.do";
}

 

  @Secured("ROLE_ADMIN")  注解

1、在spring-security.xml里开启@Secured注解支持

    <!--开启Secured注解支持-->
<securoty:global-method-security secured-annotations="enabled"/>

2、在指定的视图层Controller方法上使用  @Secured("ROLE_ADMIN")

10.页面端权限控制

pom.xml导入依赖坐标

<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-taglibs</artifactId>
  <version>version</version>
</dependency>

页面导入

<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>

6.4.2.常用标签

在jsp中我们可以使用以下三种标签,其中authentication代表的是当前认证对象,可以获取当前认证对象信息,例
如用户名。其它两个标签我们可以用于权限控制


  authentication  

<security:authentication property="" htmlEscape="" scope="" var=""/> 

property: 只允许指定Authentication所拥有的属性,可以进行属性的级联获取,如“principle.username”
 htmlEscape:表示是否需要将html进行转义。默认为true。

scope:与var属性一起使用,用于指定存放获取的结果的属性名的作用范围,默认为pageContext。Jsp中拥
有的作用范围都进行进行指定
 var: 用于指定一个属性名,这样当获取到了authentication的相关信息后会将其以var指定的属性名进行存
放,默认是存放在pageConext中

authorize是用来判断普通权限的,通过判断用户是否具有对应的权限而控制其所包含内容的显示。

<security:authorize access="" method="" url="" var=""></security:authorize>

access: 需要使用表达式来判断权限,当表达式的返回结果为true时表示拥有对应的权限

<!-- <bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />-->
access="hasRole('ADMIN')"

method:method属性是配合url属性一起使用的,表示用户应当具有指定url指定method访问的权限,
 method的默认值为GET,可选值为http请求的7种方法
 url:url表示如果用户拥有访问指定url的权限即表示可以显示authorize标签包含的内容
 var:用于指定将权限鉴定的结果存放在pageContext的哪个属性中

accesscontrollist标签是用于鉴定ACL权限的。其一共定义了三个属性:hasPermission、domainObject和var,
其中前两个是必须指定的

<security:accesscontrollist hasPermission="" domainObject="" var=""></security:accesscontrollist>

hasPermission:hasPermission属性用于指定以逗号分隔的权限列表
 domainObject:domainObject用于指定对应的域对象
 var:var则是用以将鉴定的结果以指定的属性名存入pageContext中,以供同一页面的其它地方使用

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

end

08 SSM整合案例(企业权限管理系统):10.权限关联与控制的更多相关文章

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

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

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

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

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

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

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

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

  5. 08 SSM整合案例(企业权限管理系统):09.用户和角色操作

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

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

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

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

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

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(20)-权限管理系统-根据权限获取菜单

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(20)-权限管理系统-根据权限获取菜单 不知不觉到20讲,真是漫长的日子,可惜最近工作挺忙,要不可以有更多 ...

  9. 通用权限管理系统之权限菜单zTree树的展示及移动的处理方法

    在通用权限管理系统中,有很多数据结构是有父子关系的,如组织机构,部门,权限菜单等,在展示的时候,大多数是通过zTree树的形式展现的,如下: 权限菜单展示 这种数据后台输出比较容易处理,参考如下获取某 ...

随机推荐

  1. MAC 安装 pygraphviz 找不到头文件

    networkx的有向图只能通过箭头来区别两点之间的两条边,但是我在复现snake论文的时候,需要绘制两个交叉口之间的两条不同方向的路段,最后选择了pygraphviz 直接通过anaconda打开对 ...

  2. 「Luogu P3072 [USACO13FEB]周长Perimeter」

    USACO的题目,感觉还是挺神奇的. 前置芝士 DFS(BFS)遍历:用来搜索(因为DFS好写,本文以DFS为准还不是因为作者懒) STL中的set(map)的基本用法:数据很大,不能直接存. 具体做 ...

  3. SpringCloud学习之Zuul路由转发、拦截和熔断处理(七)

    Spring Cloud Zuul 服务网关是微服务架构中一个不可或缺的部分.通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由.均衡负载功能之外,它还具备了权限控制等功能. Sp ...

  4. Lognormal distribution 对数正态分布

    转载:https://blog.csdn.net/donggui8650/article/details/101556041 在概率论中,对数正态分布是一种连续概率分布,其随机变量的对数服从正态分布. ...

  5. Nginx反向代理实现负载均衡配置图解

    Nginx反向代理实现负载均衡配置图解 [导读] 负载均衡配置是超大型机器需要考虑的一些问题,同时也是数据安全的一种做法,下面我来介绍在nginx中反向代理 负载均衡配置图解,大家可参考本文章来操作. ...

  6. Android按返回键退出程序

    既然想实现 按两次返回键 退出程序 有两个关键词 一个是 “返回键”,再一个是“退出程序” )先说“退出” 退出相信大家都会 finish(); System.exit(); 为了确保不出现问题,两种 ...

  7. Codeforces #536 A..D 题解

    foreword ummm... 开始前几个小时被朋友拉来打了这一场,总体海星,题目体验极佳,很符合口味,稍微有点点简单了不知道是不是因为是 New Year Round,很快就打到了 D,但是题目阅 ...

  8. swoole之建立 websocket server

    一.代码部分 <?php /** * 为什么用WebSocket? * HTTP的通信只能由客户端发起 * * WebSocket 协议是基于TCP的一种新的网络协议.实现了浏览器与服务器全双工 ...

  9. 第1节 网站点击流项目(上):4、网站的数据采集,使用flume的taildir实现多个文件的监控采集

    一. 模块开发----数据采集 1. 需求 在网站web流量日志分析这种场景中,对数据采集部分的可靠性.容错能力要求通常不会非常严苛,因此使用通用的flume日志采集框架完全可以满足需求. 2. Fl ...

  10. 该虚拟机似乎正在使用中 如果该虚拟机未在使用请按获取所权T按钮获取他的所有权,否则,请按取消按钮以防损坏

    虚拟机出现如下情况 不能够正常过使用,解决办法如下:直接进入上图中配置文件的目录下,然后删除所有的lck结尾的文件夹,然后重新启动, 然后file打开这个文件即可.重新进入虚拟机开机.