基本上所有网站都有后台管理系统。系统根据业务划分成不同的系统角色。而每个角色肯定是拥有着不同的权限。这个权限就根据登录后功能菜单的多少来体现。
那么这是如何实现的呢?
在刚开始接触这方面的时候,意识到权限问题,自己随手写的练手项目是将帐号表中设置一个权限字段。比如1代表超级管理员,2代表普通用户种种。用户登录进来的时候,页面里用jstl标签判断权限类型,渲染不同的静态页面。这种方法确实是可行的。但是如果后期需要增加菜单,那么就需要更改代码,或者是增加角色,也需要更改代码。如果后期有一点点变动,都需要重新对代码进行更改。
后来,看到了另一个项目,权限是这么实现的。
用于角色权限的一般设计有五张表,权限表、角色表、用户表、用户角色表、角色权限表。
1.权限表 一般设计有 id pid name code zindex page description generatemenu 字段,用来生成菜单树结构。
2.角色表 用于存储角色类型,如 超级管理员角色、普通用户等。
3.用户表 实际上就是User表,用于存储用户信息。
4.用户角色表 是角色表和用户表的关联表,多对多的关系。一个角色可对应于多个用户,一个用户也可以对应于多个角色。
5.角色权限表 是角色表和权限表的关联表,多对多的关系。一个角色拥有多个权限,一个权限也可以被多个角色拥有。
如果存在资源表 则 再加 资源表和资源角色表共七张表,不过一般是上述五表。
系统菜单一般是怎么实现的呢?
_____________________________________________
这里涉及到apache shiro框架。
//apache shiro简要介绍
它的核心功能有:认证、授权、会话管理、加密。
l shiro框架认证流程
Application Code:应用程序代码,由开发人员负责开发的
Subject:框架提供的接口,代表当前用户对象
SecurityManager:框架提供的接口,代表安全管理器对象
Realm:可以开发人员编写,框架也提供一些,类似于DAO,用于访问权限数据
使用过程:
1.maven工程的话,导入依赖
2.web.xml中配置spring整合的过滤器shiroFilter 对应的class为DelegatingFilterProxy
3.spring中配置bean id为shiroFilter
4.配置安全管理器
5.login方法进行登录认证
6.自定义Realm,并注入给安全管理器
public class BOSRealm extends AuthorizingRealm{
@Autowired
private IUserDao userDao;
//认证方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("realm中的认证方法执行了。。。。");
UsernamePasswordToken mytoken = (UsernamePasswordToken)token;
String username = mytoken.getUsername();
//根据用户名查询数据库中的密码
User user = userDao.findUserByUserName(username);
if(user == null){
//用户名不存在
return null;
}
//如果能查询到,再由框架比对数据库中查询到的密码和页面提交的密码是否一致
AuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
return info;
}
//授权方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
return null;
}
以上是登录认证(参考黑马视频bos项目文档)
_____________________________________________
而授权是怎么完成的呢?
权限拦截一般有几种方法,上述在spring中根据规则过滤是一种,还有方法注解是一种,页面shiro标签库拦截也是一种。一般使用spring过滤。
路径是这样:用户登录进来后,ztree会根据用户角色查询角色权限表,生成功能菜单树。当进入某一页面时,页面有删除按钮,如果前台页面没有进行判断是否显示,那么点击之后,系统会根据applicationContext.xml配置的过滤规则进行拦截,如果是perms拦截,进入到自定义Realm中,执行授权方法
授权方法是给用户授予权限,执行完毕后。shiro会自动判断该用户是否拥有 配置的权限,若没有则抛出未授权异常。
——————————————————————————————————————————
但是每次访问都会执行授权方法,产生效率问题。
这里采用 ehcache 来缓存权限数据
ehcache是专门缓存插件,可以缓存Java对象,提高系统性能。
使用方法:
1.导入依赖
2.提供ehcache配置文件。
3.spring配置缓存管理器对象,并注入给安全管理器。
——————————————————————————————————————
补张shiro图
原文地址:https://www.cnblogs.com/Begodpath/p/9202863.html