ACL登陆认证
前篇文章ACL授权实例介绍了授权,授权完成之后,就要进行认证。ACL的认证主要分为登陆认证与即时认证。所谓登录认证就是在用户登陆的时候,进行信息认证。根据用户Id,加载上来该用户所拥有的权限模块;而即时认证指的是用户对某一模块或记录是否有增删改查的权限。
首先来看登录认证。
下面是manager层ACLManager中有关登陆授权的信息。
package com.lzq.manager.impl; /**
* 认证管理实现
* @author lzq
*
*/
public class ACLManager extends AbstractPageManager { /**
* 搜索某个用户拥有读取权限的模块列表(用于登录,形成导航菜单的时候)
* @param userId 用户标识
* @return 模块列表(即列表的元素是Module对象)
*/
public List searchModules(int userId) { //定义临时变量
Map temp =new HashMap(); //按优先级从低到高查找用户拥有的角色
String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
"where u.id = ? order by ur.orderNo desc";
List aclIds = getHibernateTemplate().find(hql, userId); //依次循环角色
for (Iterator iter = aclIds.iterator(); iter.hasNext();) {
Integer rid = (Integer) iter.next(); //根据角色获得角色拥有的授权列表
List acls = findRoleACLs(rid); //把授权放入临时变量
for (Iterator iterator = acls.iterator(); iterator.hasNext();) {
ACL acl = (ACL ) iterator.next();
temp.put(acl.getResourceSn(), acl);
}
} //查找直接授予用户的授权列表
List acls = findUserACLs(userId);
for (Iterator iter = acls.iterator(); iter.hasNext();) {
ACL acl = (ACL) iter.next();
temp.put(acl.getResourceSn(), acl);
} //现在已获得用户拥有的所有授权(包括直接授予用户自身以及其包含的角色的授权)
List delResources = new ArrayList();
Set entries = temp.entrySet();
for (Iterator iter = entries.iterator(); iter.hasNext();) {
Map.Entry entry = (Map.Entry) iter.next();
ACL acl = (ACL)entry.getValue(); //如果没有读取权限,则需要在临时变量中删除这个授权
if(acl.getPermission(Permission.READ) == ACL.ACL_NO){
delResources.add(entry.getKey());
}
} //在临时变量中删除这些需要删除的授权
for (Iterator iter = delResources.iterator(); iter.hasNext();) {
Object key = (Object) iter.next();
temp.remove(key);
} //如果授权列表是空的,则返回0长度的集合
if(temp.isEmpty()){
return new ArrayList();
} //现在已获得用户拥有读取权限的授权
String searchModules = "select m from Module m where m.id in (:ids)";
return getSession().createQuery(searchModules)
.setParameterList("ids", temp.keySet())
.list();
} /**
* 根据角色查找角色的授权列表,返回列表的元素是:ACL实例
* @param roleId 角色Id
* @return
*/
private List findRoleACLs(int roleId){ String hql = "select acl from ACL acl where acl.principalType = ? and acl.principalSn = ?";
return getHibernateTemplate().find(hql, new Object[]{ACL.TYPE_ROLE,roleId});
} /**
* 根据用户查找直接授予用户的授权列表,返回的列表元素是ACL实例。
* 注意:如果直接授予用户的授权是继承的话,则不应该包括在这个列表中
* @param userId
* @return
*/
private List findUserACLs(int userId){
String hql = "select acl from ACL acl where acl.principalType = ? and acl.principalSn = ? and acl.aclTriState = 0";
return getHibernateTemplate().find(hql, new Object[]{ACL.TYPE_USER,userId});
}
}
下面是对应的IndexAction,通过当前用户的Id,调用上面的方法,查询上来有权限的模块。
package com.lzq.web.actions;
public class IndexAction extends BaseAction {
private ACLManager aclManager;
public void setAclManager(ACLManager aclManager) {
this.aclManager = aclManager;
}
public ActionForward outlook(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//获取当前登陆用户的所有权限
User user = (User)request.getSession().getAttribute("login");
List moduleList = aclManager.searchModules(user.getId());
request.setAttribute("moduleList", moduleList);
return mapping.findForward("outlook");
}
}
这样,便基本完成了登陆时的认证功能。
ACL登陆认证的更多相关文章
- spring-security 登陆认证之初次探究
首先,希望还对 spring-security框架完全不懂的新手 下载下Git源码. 引入到项目中.这个短文就是边看源码边聊的.也会启动下项目验证自己的推想. 一.登陆认证的登陆配置项 <for ...
- Spring集成shiro做登陆认证
一.背景 其实很早的时候,就在项目中有使用到shiro做登陆认证,直到今天才又想起来这茬,自己抽空搭了一个spring+springmvc+mybatis和shiro进行集成的种子项目,当然里面还有很 ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- 有登陆认证的情况下如何使用Wisdom RESTClient?
访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...
- django-rest-framework登陆认证
# -*- coding: utf-8 -*- __author__ = 'YongCong Wu' # @Time : 2018/10/23 15:05 # @Email : : 192287802 ...
- Firebird 手动安装 Legacy_Auth 登陆认证
下载官方发布的最新版本:V3.0.4 或者下载还没正式发布的下个版本(但已经修复了一些bug):V3.0.5 下载后解压缩,修改配置文件Firebird.conf的登陆认证为Legacy_Auth:这 ...
- MVC登陆认证简单设置
首先,弄个基类 /// <summary> /// 所有控制器基类,里面重写了OnActionExecuted方法 /// </summary> public class Ba ...
- Docker应用四:搭建docker镜像仓库(包括自生成https证书、登陆认证)
利用docker官网提供的registry镜像创建私有仓库 一.首先从docker官网拉取registry镜像: docker pull registry 二.然后运行该镜像: docker run ...
- 从 "org.apache.hadoop.security.AccessControlException:Permission denied: user=..." 看Hadoop 的用户登陆认证
假设远程提交任务给Hadoop 可能会遇到 "org.apache.hadoop.security.AccessControlException:Permission denied: use ...
随机推荐
- 01Tensorflow学习之Tensorflow基本介绍
1 tensorflow简介 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基 ...
- 3类与对象——重拾Java
面向对象编程的3个特性 1 封装性 面向对象编程核心思想之一就是将数据和对数据的操作封装在一起.通过抽象,即从具体的实例中抽取共同的性质形成一般的概念,比如类的概念. 在实际生活中,我们每时每刻都在与 ...
- MongoDB 集合命令
集合命令 创建语法如下 name是要创建的集合的名称 options是一个文档,用于指定集合的配置,选项参数是可选的,所以只需要到指定的集合名称 可以不手动创建集合,向不存在的集合中第一次加入数据 ...
- 数据预处理之独热编码(One-Hot Encoding)(转载)
问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...
- django通过url传递参数(编辑操作页面)
在做到编辑部分时,想到的办法是在编辑上跳转到页面时给他一个包含唯一标识id的url,然后通过这个url中的id去查询出该条数据,将数据内容显示在编辑页面. 1.编辑按钮 <button on ...
- Cocos2d-x 3.x 在wp8中调用系统字体的解决方案
问题和解决方法: 在使用cocos2d-x设计游戏的时候,字体是个很重要的部分.如果游戏中对字体没有太多的要求,就可以使用平台系统自带的字体,可以节省游戏的尺寸,以及减小游戏运行时所占用的内存.当加载 ...
- [leetcode]146. LRU CacheLRU缓存
Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...
- [leetcode]159. Longest Substring with At Most Two Distinct Characters至多包含两种字符的最长子串
Given a string s , find the length of the longest substring t that contains at most 2 distinct char ...
- CentOS 7安装Samba 4.6 版本步骤及错误解决方法
首先通过这次教训,让我养成一个好习惯:备份 备份 备份 不管做什么配置或者更改什么东西之前先做好备份! 还有我本身的一个坏毛病:眼高手低! 工厂有一台服务器,由以前的运维装的Samba ...
- vsftp上传文件出现553 Could not create file
没有权限创建文件或是目录,原因是selinux引起的登陆问题. 通过如下命令查看状态: > sestatus -b|grep ftp 设置allow_ftpd_full_access为on. 在 ...