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. POJ 1458 Common Subsequence 最长公共子序列

    题目大意:求两个字符串的最长公共子序列 题目思路:dp[i][j] 表示第一个字符串前i位 和 第二个字符串前j位的最长公共子序列 #include<stdio.h> #include&l ...

  2. 20165237 2017-2018-2 《Java程序设计》第8周学习总结

    20165237 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容总结 1.程序:一段静态的代码,它是应用软件执行的蓝本. 2.进程:程序的一次动态执行过程,它对应 ...

  3. linux下 gdb+coredump 调试偶发crash的程序

    1. 打开 core dump 查看是否打开 ulimit -c 如果输出0, 说明没有打开. 方法一:使用命令 ulimit -c unlimited 可以打开,但是只对当前终端有效, 方法二: 配 ...

  4. SpringSecurity自定义用户认证逻辑

    ⒈处理用户信息获取逻辑 用户信息的获取逻辑是被SpringSecurity封装到UserDetailsService接口里面的 package org.springframework.security ...

  5. 利用crash 分析软死锁问题【转】

    转自:https://blog.csdn.net/divlee130/article/details/47806551 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  6. Bringing Native Performance to Electron

    Bringing Native Performance to Electron https://realm.io/blog/native-performance-electron-realm/ Rea ...

  7. Ubuntu14下nginx服务器链接PHP

    报错:nginx下无法打开php,报错[error] 5040#0: *1 connect() failed (111: Connection ref ... server { listen ; #l ...

  8. 关于Mac的rootless问题

    由于在OS X 10.11版本添加了rootless,使得root用户在DOS命令下无法操作系统文件并提示无权限. 解决办法: 首先确认升级到最新版本 重新启动电脑,持续按住Command-R直到看见 ...

  9. $Django 等web框架,交互,基础入门

    1 web 应用2 c/s 和bs架构3 python中的web框架    a :socket    b:路由跟视图函数匹配关系    c:模板渲染 django: uwsgi/wsgiref    ...

  10. https 对 json空对象解析的影响

    2017年11月24日09:56:01 记录一个问题: PHP返回json给APP(安卓, fastjson) 其中一个值是空对象  json_encode( [ 'aaa' => new st ...