网站后台系统权限部分实现

  基本上所有网站都有后台管理系统。系统根据业务划分成不同的系统角色。而每个角色肯定是拥有着不同的权限。这个权限就根据登录后功能菜单的多少来体现。

  那么这是如何实现的呢?

  在刚开始接触这方面的时候,意识到权限问题,自己随手写的练手项目是将帐号表中设置一个权限字段。比如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图

 

posted @ 2018-06-20 11:16  三笠丶阿克曼  阅读(411)  评论(0编辑  收藏  举报