shiro配合html页面完成细粒化权限控制

原创 2016年10月04日 12:02:34
  • 8924

shiro是现在非常普遍使用的java权限框架了,因为其使用非常的简便,适合快速的解决项目的权限需求问题。

现在我在自己项目中配置了shiro,项目前端是html静态界面,动态数据都是由ajax完成。shiro中使用框架提供的jsp标签完成页面的细粒化权限控制,在我这个情况下无法配合使用,所以自己稍微拓展了一下,可以便捷的控制html页面控件的权限。

在网上没有查询到类似的用法,所以这里分享一下自己的方法,顺便也简单记录一下项目实战中使用shiro快速的开发流程作为参考。

首先 数据库中三个基本的表和基本的字段  下面是最简化的建表

项目中使用的是mybatis与数据库交互   mapper的xml文件中这样写分别获取用户 角色 权限

  1. <resultMap id="BaseResultMap" type="com.cyt.music.interfaces.pojo.user.UserInfo" >
  2. <id column="id" property="id" jdbcType="INTEGER" />
  3. <result column="userName" property="username" jdbcType="VARCHAR" />
  4. <result column="userStatus" property="userstatus" jdbcType="VARCHAR" />
  5. <result column="roleId" property="roleid" jdbcType="INTEGER" />
  6. <result column="password" property="password" jdbcType="VARCHAR" />
  7. </resultMap>
  8. <select id="getByUserName" parameterType="String" resultMap="BaseResultMap">
  9. select * from user_info where userName=#{userName}
  10. </select>
  11. <select id="getRoles" parameterType="String" resultType="String">
  12. select r.roleName from user_info u,user_role r where u.roleId=r.id and u.userName=#{userName}
  13. </select>
  14. <select id="getPermissions" parameterType="String" resultType="String">
  15. select p.permissionName from user_info u,user_role r,user_permission p where u.roleId=r.id and p.roleId=r.id and u.userName=#{userName}
  16. </select>

然后是shiro的核心 自定义realm 网上有很多教程都非常详细的讲解了realm 在这里也是非常简化的自定义

  1. @Resource
  2. private UserService userService;
  3. /**
  4. * 为当限前登录的用户授予角色和权
  5. */
  6. @Override
  7. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  8. String userName=(String)principals.getPrimaryPrincipal();
  9. SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
  10. authorizationInfo.setRoles(userService.getRoles(userName));
  11. authorizationInfo.setStringPermissions(userService.getPermissions(userName));
  12. return authorizationInfo;
  13. }
  14. /**
  15. * 验证当前登录的用户
  16. */
  17. @Override
  18. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  19. String userName=(String)token.getPrincipal();
  20. UserInfo user=userService.getByUserName(userName);
  21. if(user!=null){
  22. AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUsername(),user.getPassword(),"xx");
  23. return authcInfo;
  24. }else{
  25. return null;
  26. }
  27. }

如何整合springmvc去配置自定义realm  和配置过滤器这些在网上都有非常详细的配置说明

接下来就是自定义的html细粒化控制了

在前端每个页面加载的时候都要向后台发出一次请求去请求到当前登录用户的角色

  1. $(document).ready(function () {
  2. //判断角色
  3. judgeAuthority();
  4. });
  5. function judgeAuthority(){
  6. $.ajax({
  7. type: "post",
  8. url: "",
  9. contentType: 'application/json;charset=utf-8',
  10. success: function (data) {
  11. for(var i=0;i<data.length;i++){
  12. if(data[i]=="admin"){
  13. $(".admin").css("display","block");
  14. }
  15. }
  16. }
  17. })
  18. }

在你需要做隐藏的控件class中 加载你定义的角色名就可以了 在此处是admin  这两个按钮只有在拥有admin角色用户登陆的时候才会显示

最后controller层对角色进行控制,吧当前用户拥有的角色json形式返回给前端,前端自己处理

  1. @RequestMapping("/session")
  2. public @ResponseBody List<String> session(HttpServletRequest request){
  3. Subject subject= SecurityUtils.getSubject();
  4. Session session=subject.getSession();
  5. List<String> roleList=new ArrayList<String>();
  6. if(subject.hasRole("admin")){
  7. roleList.add("admin");
  8. }
  9. if(subject.hasRole("teacher")){
  10. roleList.add("teacher");
  11. }
  12. return roleList;
  13. }

至此即可以完成html页面对每个控件都能根据登陆 用户角色的不同进行权限控制了
方法是能走通 勉强实现自己的需求,感觉可以做一个好点的封装能把角色名暴露出来自定义,把前端操作暴露出来自定义不仅仅只是空间的显示或者隐藏.这些都可以在后续做思考和修改。 

shiro配合html页面完成细粒化权限控制的更多相关文章

  1. Springboot + Vue + shiro 实现前后端分离、权限控制

    本文总结自实习中对项目对重构.原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelA ...

  2. vue基于页面中按钮权限控制

    main.js // 权限 /** 权限指令,对按钮权限的控制 **/ Vue.directive('allow', { bind: function(el, binding) { // 通过当前按钮 ...

  3. Spring Boot + Vue + Shiro 实现前后端分离、权限控制

    本文总结自实习中对项目的重构.原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelA ...

  4. Vue多页面 按钮级别权限控制 directive指令控制

    利用driective 构建自己的指令,实现按钮级别权限 项目结构如下: 修改router.js { path: 'schools', name: '列表', component: () => ...

  5. JAVAEE——BOS物流项目11:在realm中授权、shiro的方法注解权限控制、shiro的标签权限控制、总结shiro的权限控制方式、权限管理

    1 学习计划 1.在realm中进行授权 2.使用shiro的方法注解方式权限控制 n 在spring文件中配置开启shiro注解支持 n 在Action方法上使用注解 3.★使用shiro的标签进行 ...

  6. Shiro的认证和权限控制

    权限控制的方式 从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别 ...

  7. shiro权限控制入门

    一:权限控制两种主要方式 粗粒度 URL 级别权限控制和细粒度方法级别权限控制 1.粗粒度 URL 级别权限控制 可以基于 Filter 实现在数据库中存放 用户.权限.访问 URL 对应关系, 当前 ...

  8. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  9. springmvc+shiro+freemarker实现的安全及权限管理

    本文讲述了基于springmvc+shiro实现安全管理,shiro+freemarker实现权限验证. 首先我们从web.xml开始: <?xml version="1.0" ...

随机推荐

  1. 《jQuery精品教程视频》-每天的复习笔记

    第一天 //jquery:简单.粗暴 //jq和js的关系 //js是什么? js是一门编程语言 //jq仅仅是基于js的一个库,jq可理解为就是开发js的一个工具. //概念 //1. 为什么要学j ...

  2. Polish Extraction Zone

    声明贴花组件 UPROPERTY(VisibleAnywhere, Category = "Components") UDecalComponent* DecalComp; 添加头 ...

  3. MySql cmd下的学习笔记 —— 有关select的操作(max, min等常见函数)

    先把之前建的goods表找到 找到最贵的本店价(max) 找到最便宜的本店价(min) 查出一共还有多少商品(count) 查看商品价的平均价(avg) 查看本店有多少种商品 当count(*)时 输 ...

  4. SpringCloud知识点20190313

    1.SpringBoot和SpringCloud的关系(面试题) Spring Boot 可以离开 Spring Cloud 单独使用开发项目,但是Spring Cloud离不开SpringBoot, ...

  5. python,os.path简单用法

    #首先导入os包 import os#引入time模块是因为需要将浮点型的时间转为东八区时间 import time # basename(path),去掉路径名称,单独返回文件名 f = os.pa ...

  6. [转] 理解CheckPoint及其在Tensorflow & Keras & Pytorch中的使用

    作者用游戏的暂停与继续聊明白了checkpoint的作用,在三种主流框架中演示实际使用场景,手动点赞. 转自:https://blog.floydhub.com/checkpointing-tutor ...

  7. Java 类加载机制(阿里面试题)-何时初始化类

    (1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进 ...

  8. 利用shell简单监控网络设备的接口状态发出告警

    作者:邓聪聪 #!/bin/sh Date=$(date +%F_%T) iplist=`cat ip.txt |awk '{print $1}'` snmp="hjsz-snmp" ...

  9. 一个优秀windows C++ 程序员该有哪些知识

  10. Laravel 5.2问题-----postman进api的post请求,为什么出现Forbidden?

    Forbidden?就纳闷了,有写验证规则的,但是它出现紧张,感觉就是我落了设置什么东西了才会这样? 果不其然, Laravel有个一自动验证的,创建的时候是默认打开的, namespace App\ ...