权限的理解
权限的话,权限做起来就是5张表;用户表、角色表、用户角色表、权限表、权限角色表。给用户授角色给角色授权限;我认为权限,就是不同用户登录看到的菜单按钮不同这是一个表面的权限,真正做的好在于它内部的拦截,我每点击一个url我就知道它有没有权限,就比如新增按钮,我页面上没有新增按钮,我非法拿到了新增按钮是url,我是否能够操作?,这就需要内部拦截,页面显示不难,比如左侧菜单完全可以用树的形式,通过用户登录拿到用户id,根据用户id查到一组角色id,根据一组角色id查到一组权限,然后把权限显示到页面上。但是页面没有这个按钮,如果我非法拿到按钮的url进行访问时,这样如何去进行拦截,才是重点,具体怎么做其实有很多方法,我简单总结了以下有两种,是运用了Shiro,因为我每一个url都会有一个对比,去判断它是否有权限,那么我就会设置一个权限标记,比如说我页面上有个按钮,我给按钮做一个权限标记,然后存到数据库中,当我登录后,需要拦截的时候把这些权限标记拿出来,那么问题是怎么根据url得到一组权限标记和取出来的一组权限标记进行对比,判断是否有权限呐?我总结的有两种,一种就是,我们现在用的是springmvc,我直接在方法上面指定一个权限标记,这个url对应的就是这个权限标记,这样的话当我请求的时候就会把url和权限标记进行对比,看他是否有权限;还有一种就是,通过url进行规则化,然后通过url算出一组权限标记,然后写一个Realm.java拦截器,然后把这个url算出权限标记跟Shrio里面存的一组权限标记进行对比,如果有就拦截上,没有就拦截不了。
其实权限做的更好就是做到数据权限,数据权限就是页面上 的按钮菜单都一样,但是不同身份的人点击同样的按钮或菜单它显示的数据是不同的。比如有一个菜单叫,工资管理,普通员工点击显示自己的工资信息,而总经理点击看到的是整个部门的工资信息,这就是数据权限。做数据权限就是看这个数据的范围是有什么决定的,一般数据的范围是根据部门决定的,就是在我给角色授权的时候我可以决定它可以访问到那些部门,所以就要表结构的改变,在用户角色表中再添加一个字段,部门 id或你要访问的数据范围,将来查询的时候结果是一个权限的id对应一个部门的id,当我在页面点击的时候,就会向后台传一个部门的id,查询的时候就根据部门id查出数据,这样就做到了数据权限!
Shiro控制权限的执行流程
在pom.xml中配置Shiro依赖(shiro-spring1.2.4、shiro-ehcache1.2.4等)
Web.xml(shiroFilter)和Spring-Service.xml中配置拦截器(shiroFilter)绑定Realm.java实体类在 LoginAction.java当用户登录的时候去查用户信息,然后存在cache里,(使用用户的登录信息创建Token来new UsernamePasswordToken(username, password) 验证客户身份是否合法)
合法的话在Realm.java类中对客户认证并授权,有两个方法第一个认证方法一、AuthenticationInfo:认证
//得到用户Subject
Subject currentUser=SecurityUtils.getSubject();
currentUser.getSession().setAttribute("user", user);//将用户对象存入Subject(SecurityUtils安全工具)
查询数据库,取用户名密码
AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user.getName(), user.getPassword(), this.getName());
return authenticationInfo;
二、AuthorizationInfo :授权
1.根据用户名查询当前用户拥有的角色(存入集合中后遍历)
1.1将角色名称提供给info
authorizationInfo.setRoles(角色集合set);
2.根据角色查询当前权限按钮标记名称(存入集合中后遍历)
2.1 将权限名称提供给info
authorizationInfo.setStringPermissions(权限标记集合set);
return authorizationInfo;
在jsp中使<shiro:haspermission. name="权限标记">标签包按钮;控制显示