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. makefile中的gcc -o $@ $^是什么意思?

    $@表示目标,$^表示依赖列表. 比如: edit : main.o kbd.o command.o display.o insert.o search.o files.o utils.o $@就是e ...

  2. web@前端--html,css,javascript简介、第一个页面(常用标签简介)

    1.什么是标签#1.在HTML中规定标签使用英文的的尖括号即`<`和`>`包起来,如`<html>`.`<head>`.`<body>`都是标签,#2. ...

  3. hybrid programming based on python and C/C++

    Python/C API Reference Manual¶ https://docs.python.org/3/c-api/index.html Extending and Embedding th ...

  4. Sql语句之并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)

    UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT  学号, 课程号, 成绩 FROM   学习 WHERE   课程号='180101' ...

  5. 前端 ----js的事件流的概念(重要)

    09-JS的事件流的概念(重点)   在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页 ...

  6. python PIL实现图片合成

    在项目中需要将两张图片合在一起.遇到两种情况,一种就是两张非透明图片的合成, 一种是涉及到透明png的合成. 相关API见 http://pillow.readthedocs.io/en/latest ...

  7. Android 代码混淆 混淆方案

    本篇文章:自己在混淆的时候整理出比较全面的混淆方法,比较实用,自己走过的坑,淌出来的路.请大家不要再走回头路,可能只要我们代码加混淆,一点不对就会导致项目运行崩溃等后果,有许多人发现没有打包运行好好地 ...

  8. LONG数据类型转换为VARCHAR2并相互转换

    --方法1,支持表 --plsql中将long类型隐式转换为varchar2,但是sql不能CREATE OR REPLACE FUNCTION LONG_TO_CHAR( in_rowid rowi ...

  9. 牛客网 python 求解立方根

    •计算一个数字的立方根,不使用库函数 详细描述: •接口说明 原型: public static double getCubeRoot(double input) 输入:double 待求解参数 返回 ...

  10. 深入理解ajax

    http://www.imooc.com/code/13468    基础练习 http://www.imooc.com/video/5644            !ajax! 常用   for   ...