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. 使用Office Online Server在线预览Office

    微软官方文档介绍 ⒈介绍 Office Online Server是 Office Web Apps Server 的升级版本,安装环境必须为两台Windows Server 2012 R2 或 Wi ...

  2. requests库入门10-超时,错误与异常

    在实际发布到生产上的接口测试代码,都会加上超时的设置,当服务器超过一定时间没有响应,会报出超时异常.因为requests会自动等待响应.如果不加上超时的设置,可能脚本会一直卡在那里.. 超时设置在请求 ...

  3. UrlDecode

    void Decode(char *p){int i=0;while(*(p+i)){ if ((*p=*(p+i)) == '%') { *p=*(p+i+1) >= 'A' ? ((*(p+ ...

  4. OninitDialog与OnCreate两个消息有何区别

    WM_INITDIALOGThe WM_INITDIALOG message is sent to the dialog box procedure immediately before a dial ...

  5. configparser模块--配置文件

    该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 创建文件 import configparser config = ...

  6. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  7. 使用python脚本批量删除阿里云oss中的mp4文件

    #encoding:utf-8 ''' oss中有一些mp4文件需要删除,首先定位出这些文件放在txt文本中 然后通过python操作oss进行批量删除 ''' import oss2 auth = ...

  8. hibernate映射关系(多对多)

    Student与Teacher关系多对多(只建了2个实体类) public class Student { private int id; private String name; private S ...

  9. GIT入门文档

    集中式(SVN): 集中式版本控制系统,版本库是集中存放在中央服务器的,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器. 集中式版本控制系 ...

  10. SQL Server代码段

    1.cast和convert ' as int) -- 123 ') -- 123 select CAST(123.4 as int) -- 123 select CONVERT(int, 123.4 ...