JAVA权限管理及其实现思路

合集下载

JAVA权限管理及其实现思路

JAVA权限管理及其实现思路

JAVA权限管理及其实现思路Java是一种面向对象的编程语言,它提供了很多机制来实现权限管理。

权限管理是保护系统资源和数据的重要措施,它可以控制用户对系统的访问权限,保证系统的安全性和可靠性。

在Java中,实现权限管理通常涉及以下几个方面:身份认证、访问控制、角色与权限管理和审计日志。

首先,身份认证是权限管理的基础。

在Java中,可以通过使用用户名和密码进行身份认证。

通常情况下,用户会提供用户名和密码来验证其身份。

可以使用Java中的加密技术对用户的密码进行加密储存,以保证密码的安全性。

身份认证可以通过数据库、LDAP服务器或其他第三方身份验证服务来实现。

其次,访问控制是实现权限管理的关键。

它可以通过在代码中添加访问控制语句、使用访问修饰符或使用自定义注解来实现。

Java中的访问修饰符(public、private、protected)可以限制对类、方法和变量的访问权限。

访问控制还可以使用自定义注解来定义特定的权限,然后在代码中使用注解处理器来处理这些注解,以实现细粒度的访问控制。

角色与权限管理是权限管理的核心。

它将用户分为不同的角色,每个角色具有不同的权限。

具体来说,在Java中可以使用角色和权限表来实现。

角色与权限表包含了角色和权限的对应关系,可以通过查询表来确定用户是否具有一些权限。

可以使用数据库或配置文件来存储角色与权限表。

最后,审计日志是权限管理的补充。

它可以记录用户的操作行为,包括登录情况、访问情况和权限变更情况。

通过分析审计日志,可以及时发现系统中的异常操作,保证系统的安全性和可靠性。

在Java中,可以使用日志框架如log4j来实现审计日志。

总结来说,Java权限管理的实现思路主要包括身份认证、访问控制、角色与权限管理和审计日志。

通过合理地运用这些机制,可以实现系统的权限管理,保证系统的安全性和可靠性。

同时,可以根据具体的需求,使用不同的存储方式和技术来实现权限管理,以满足系统的特定需求。

java权限管理思路

java权限管理思路

java权限管理思路在Java权限管理系统中,实现权限管理的思路通常包括以下几个核心步骤和组件:1. 实体定义:用户表(user):记录每个用户的基本信息,包含用户ID(如userId)等。

角色表(role):存储不同角色的信息,例如角色ID(roleId)、角色名称等。

菜单/资源表(menu 或resource):定义系统中的菜单、按钮或其他可操作资源,包括资源ID(menuId)、资源路径或名称等。

角色菜单权限表(role_menu):记录角色与菜单之间的关联关系以及对应的权限级别,如增删改查等操作权限。

2. 权限分配:在给用户分配角色时,通过角色菜单权限表批量赋予用户相关的菜单权限。

对于更细粒度的权限控制,如按钮级别的权限,可能需要额外的中间表来表示用户对具体功能点的操作权限,如user_menu 表。

3. 权限控制逻辑:在后端服务中,设计一个权限校验机制,根据当前登录用户的ID查询其拥有的角色及对应权限,并在执行敏感操作前进行权限检查。

可以采用访问控制列表(ACL, Access Control List)的方式,其中每条记录代表一个用户对特定资源的操作权限。

ACL可以通过位运算进行优化,例如使用int类型的32位来表示多个权限状态,不同的位代表不同的操作权限。

4. 动态权限加载:系统支持动态权限加载,即在用户登录时加载其角色及权限,并缓存至用户会话中,减少实时查询数据库带来的性能损耗。

5. 权限变更处理:当用户的角色发生变更时,需要及时更新用户的权限集合,确保权限数据的同步。

6. 前端展示:根据用户权限,在前端界面隐藏或显示相应的菜单和按钮,实现界面级别的权限控制。

基于java的权限管理系统的设计与实现

基于java的权限管理系统的设计与实现

一、概述权限管理系统是一个在网络环境下进行用户身份认证、访问控制和资源保护的重要组成部分。

随着互联网的迅猛发展,各种网络应用的出现和普及,对权限管理系统的要求也越来越高。

本文旨在探讨基于Java的权限管理系统的设计与实现,为构建安全可靠、高效灵活的权限管理系统提供参考。

二、需求分析1. 用户管理:包括用户的添加、删除、修改和查看等操作;2. 角色管理:定义各种角色,并为角色赋予相应的权限;3. 权限管理:管理系统中的各项功能和资源的访问权限;4. 访问控制:对用户对各项功能和资源的访问进行控制;5. 日志管理:记录用户的操作日志,用于追踪和审计。

三、系统架构设计1. 技术选型:采用Java语言作为开发主要语言,采用Spring框架作为系统的核心框架,使用Spring Security对用户访问进行安全控制,使用MyBatis作为持久层框架;2. 模块划分:将系统划分为用户管理模块、角色管理模块、权限管理模块、访问控制模块和日志管理模块,便于系统的扩展和维护;3. 数据库设计:设计用户表、角色表、权限表、用户角色关联表、角色权限关联表等数据库表,确保数据的完整性和安全性。

四、系统实现1. 用户管理模块实现用户的增删改查功能的实现,包括用户信息的录入、修改、删除和查询等功能;2. 角色管理模块实现角色的定义及权限分配功能的实现,包括角色的添加、修改、删除和权限分配等功能;3. 权限管理模块实现系统的各项功能和资源的访问权限的管理,包括权限的添加、修改、删除和查询等功能;4. 访问控制模块实现对用户对各项功能和资源的访问进行控制,确保用户的访问符合系统的安全策略;5. 日志管理模块实现记录用户的操作日志,用于追踪用户的操作和进行审计。

五、系统测试系统测试是保证权限管理系统质量的关键环节。

包括单元测试、集成测试、系统测试和验收测试等多个阶段,通过测试保证系统的功能完整和安全可靠。

六、总结与展望基于Java的权限管理系统的设计与实现是一个复杂而又重要的系统工程。

JAVA实现用户的权限管理

JAVA实现用户的权限管理

⼀:权限管理简介做系统时肯定遇到最常见的就是不同的⽤户的需求是不⼀样的,就拿登陆来说,⼀个办公管理系统,不同部门的⼈肯定要求的功能和权限都是不⼀样的,那你不可能对每⼀个部⼆:数据表的设计根据⾓⾊授权的思想,我们需要涉及五张表(简单⼀写,没写约束,凑活看吧)三:使⽤Shiro整合Spring进⾏管理权限四:Shiro在Web项⽬中的使⽤ 实战中shiro的应⽤很多,⼏乎都要⽤到,这⾥举⼀个Blog的登陆的例⼦,更好的理解和使⽤。

本博客是采⽤spring+springMVC+Mybatis实现的。

<P style="padding: 30px 0px 10px; position: relative;"><SPAN class="u_logo"></SPAN><INPUT id="userName" name="userName" class="ipt" type="text" placeholder="请输⼊⽤户名" value="${erName }"></P><P style="position: relative;"><SPAN class="p_logo"></SPAN><INPUT id="password" name="password" class="ipt" type="password" placeholder="请输⼊密码" value="${blogger.password }"></P><DIV style="height: 50px; line-height: 50px; margin-top: 30px; border-top-color: rgb(231, 231, 231); border-top-width: 1px; border-top-style: solid;"><P style="margin: 0px 35px 20px 45px;"><span><font color="red" id="error">${errorInfo }</font></span><SPAN style="float: right;"><input type="submit" style="background: rgb(0, 142, 173); padding: 7px 10px; border-radius: 4px; border: 1px solid rgb(26, 117, 152); border-image: none; color: rgb(255, 255, 255); font-weigh </SPAN></P></DIV></DIV></form>package com.xqc.controller;/*** 博主Controller层**/@Controller@RequestMapping("/blogger")public class BloggerController {@Resourceprivate BloggerService bloggerService;/*** ⽤户登录* @param blogger* @param request* @return*/@RequestMapping("/login")public String login(Blogger blogger,HttpServletRequest request){Subject subject=SecurityUtils.getSubject();UsernamePasswordToken token=new UsernamePasswordToken(blogger.getUserName(), CryptographyUtil.md5(blogger.getPassword(), "xqc"));try{subject.login(token); // 登录验证return "redirect:/admin/main.jsp";}catch(Exception e){e.printStackTrace();request.setAttribute("blogger", blogger);request.setAttribute("errorInfo", "⽤户名或密码错误!");return "login";}}}<!-- Shiro过滤器 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- Shiro的核⼼安全接⼝,这个属性是必须的 --><property name="securityManager" ref="securityManager"/><!-- ⾝份认证失败,则跳转到登录页⾯的配置 --><property name="loginUrl" value="/login.jsp"/><!-- Shiro连接约束配置,即过滤链的定义 --><property name="filterChainDefinitions"><value>/login=anon/admin/**=authc</value></property></bean>package com.xqc.realm;import javax.annotation.Resource;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import com.xqc.entity.Blogger;import com.xqc.service.BloggerService;/*** ⾃定义Realm**/public class MyRealm extends AuthorizingRealm{@Resourceprivate BloggerService bloggerService;/*** 为当限前登录的⽤户授予⾓⾊和权*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}/*** 验证当前登录的⽤户*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String userName=(String)token.getPrincipal();Blogger blogger=bloggerService.getByUserName(userName);if(blogger!=null){SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger); // 当前⽤户信息存到session中AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(blogger.getUserName(),blogger.getPassword(),"xx"); return authcInfo;}else{return null;}}}package com.xqc.util;import org.apache.shiro.crypto.hash.Md5Hash;/*** 加密⼯具**/public class CryptographyUtil {/*** Md5加密* @param str* @param salt* @return*/public static String md5(String str,String salt){return new Md5Hash(str,salt).toString();}}分⾓⾊赋予不同的权利啦!分⾓⾊回显不同的信息啦!。

JAVA实现权限管理的两种方式六

JAVA实现权限管理的两种方式六

JAVA实现权限管理的两种方式六第一种方式:利用filter、xml文件和用户信息表配合使用来实现权限管理。

1.过滤器filterackage .aaa.bbb.filter;imort java.io.IOExcetion;imort java.io.InutStream;imort java.util.HashMa;imort java.util.Iterator;imort java.util.List;imort java.util.Ma;imort javax.servlet.Filter;imort javax.servlet.FilterChain;imort javax.servlet.FilterConfig;imort javax.servlet.ServletContext;imort javax.servlet.ServletExcetion;imort javax.servlet.ServletRequest;imort javax.servlet.ServletResonse;imort javax.servlet.htt.HttServletRequest; imort javax.servlet.htt.HttServletResonse; imort mons.logging.Log;imort mons.logging.LogFactory;imort org.dom4j.Document;imort org.dom4j.Element;imort org.dom4j.io.SAXReader;imort er;imort .aaa.bbb.util.HttUtils;/*** 过滤:后台管理的模块授权。

根据:配置文件xml根据当前session 中用的管理员信息。

* 注:不用再访问数据库。

也不需要再使用什么bean 去判断。

直接在这个类里就可以判断。

* author cuiguangqiang**/ublic class ManagerAuthFilter imlements Filter {rotected static final Log logger = LogFactory.getLog(ManagerAuthFilter.class);ublic static final String MAING_FILE = &quot;/WEB-INF/managerauthmaing.xml&quot;;rivate ServletContext context = null;rivate Ma actions = new HashMa();ublic void init(FilterConfig filterConfig) throws ServletExcetion {context = filterConfig.getServletContext();if(context==null){logger.error(&quot;unable to init as servlet context is null&quot;);return;}loadConf();(&quot;ManagerAuthFilter configure success.&quot;);}rivate void loadConf() {InutStream inutStream = context.getResourceAsStream(MAING_FILE); if (inutStream == null) {(&quot;unable find auth maing file &quot; + MAING_FILE); } else {actions = arseConf(inutStream);}}rivate Ma arseConf(InutStream inutStream) {try {SAXReader reader = new SAXReader(); Document document = reader.read(inutStream); return createActionMa(document);} catch (Excetion e) {(e.getMessage());e.rintStackTrace();}return new HashMa();}rivate Ma createActionMa(Document document) { Ma ma = new HashMa();Element root = document.getRootElement();//处理XML读入JAVA Object对象中。

JAVA权限管理及其实现思路

JAVA权限管理及其实现思路

权限管理及其实现思路●需求:oa系统包含众多模块,要求能够通过权限管理,控制不同用户对模块的访问权限,而且需要控制到(增删改查)CRUD操作的级别。

要求能通过角色对用户进行统一授权,在某些特殊情况下,能够单独对用户进行授权。

●分析⏹概念模型●设计:⏹在用户与角色的关系中,以用户为主来进行设计符合客户的使用习惯,即“将多个角色授予某个用户(让用户拥有多个角色)”,比“将多个用户添加到某个角色上”更加让人容易理解。

⏹模块的授权以针对角色为主,即大部分的情况下,针对角色来分配模块的权限⏹一旦根据角色划分好权限之后,就可以进行用户的创建工作,同时可以给用户分配角色(可以为多个),用户将拥有其所属角色的所有权限(这样就达到了统一控制的目的)⏹由于一个用户可以拥有多个角色,系统无法对角色的授权进行控制(或者说无需对其授权进行控制,因为为了给客户提供更大的灵活性),所以很有可能出现授权有冲突的多个角色被授予同一个用户的情况,比如:角色A对模块A有删除权限,但角色B对模块A的删除权限则被禁止,这时候,如果将角色A和角色B同时授予用户A,则会造成困扰,究竟用户A对模块A的删除权限是允许还是不允许?它应该是以角色A的授权为准,还是应该以角色B的授权为准?针对这个问题,可以考虑如下解决办法:◆第一种解决办法是:如果多个角色之间有授权冲突,则不允许将这些角色同时授予同一个用户,比如,在上述例子中,不允许将角色A和角色B同时授予用户A◆第二种解决办法是:允许将有授权冲突的角色同时授予同一个用户,但用户在某个时刻只能扮演其中的某个角色。

在用户登陆后台管理界面之后,可以通过切换角色,来执行不同的操作!◆第三种解决办法是:允许将有授权冲突的角色同时授予同一个用户,对用户的这些角色来说,有优先级的概念,当将角色分配给用户的时候,应该设置它的优先级。

同一个角色在不同的用户那里可能具有不同的优先级。

当授权有冲突的时候,以优先级更高的角色授权为准。

JAVA实现权限管理的两种方式

JAVA实现权限管理的两种方式

public static final String MAPPING_FILE = "/WEB-INF/managerauthmapping.xml";
private ServletContext context = null;
private Map actions = new HashMap();
import mons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import er;
}
}
private Map parseConf(InputStream inputStream) {
try {
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
import .aaa.bbb.util.HttpUtils;
/**
* 过滤:后台管理的模块授权。根据:配置文件xml,根据当前session中用的管理员信息。
* 注:不用再访问数据库。也不需要再使用什么 bean 去判断。直接在这个类里就可以判断。
//(1)得到此次用户的提交请求
String url = req.getServletPath();
//(2)只有在配置文件中存在的 action 才进行处理
String method = req.getParameter("method");

java数据列权限设计思路

java数据列权限设计思路

在Java中,设计数据列权限控制需要考虑以下几个步骤:
1.确定权限需求:首先,需要明确系统对数据列权限的需求。

例如,哪些用户需要访
问哪些数据列,以及他们需要执行哪些操作(如读取、修改、删除等)。

2.定义角色和权限:根据需求,定义不同的角色,并为每个角色分配相应的权限。


如,管理员角色可以拥有所有权限,而普通用户可能只拥有读取权限。

3.设计数据模型:在数据库中设计数据模型时,需要考虑权限控制的需求。

可以为数
据表添加一个权限字段,用于标识哪些用户可以访问该数据列。

4.实现数据层面的权限控制:在查询数据时,根据用户的角色和权限,对数据进行过
滤和限制。

例如,只有具有读取权限的用户才能查询到数据列的值。

5.业务逻辑层面的权限控制:在业务逻辑中,也需要对数据进行权限控制。

例如,在
更新数据时,需要检查用户是否具有修改权限。

6.界面层面的权限控制:在界面上,也需要根据用户的角色和权限来显示或隐藏相应
的数据列。

需要注意的是,数据列权限控制是一个复杂的过程,需要考虑多个方面。

因此,在实际开发中,建议采用成熟的框架或库来实现权限控制,如Spring Security、Shiro等。

这些框架提供了丰富的功能和灵活的配置选项,可以大大简化权限控制的设计和实现过程。

java数据权限设计思路

java数据权限设计思路

java数据权限设计思路Java数据权限设计思路在现代软件开发中,数据权限的管理变得越来越重要。

数据权限是指对系统中的数据进行访问和操作的权限控制。

合理的数据权限设计可以保护数据的安全性、完整性和机密性,同时也能提高系统的性能和效率。

本文将讨论Java数据权限设计的思路和方法。

1. 角色和权限的定义需要定义系统中的角色和权限。

角色是指用户在系统中扮演的角色,权限是指角色对数据的访问和操作权限。

可以根据系统的需求定义不同的角色,如管理员、普通用户、访客等,然后为每个角色分配相应的权限。

2. 数据层面的权限控制数据层面的权限控制是指对数据的访问和操作进行权限控制。

可以通过以下方法实现数据层面的权限控制:- 行级权限控制:对于某些敏感数据,可以定义行级权限,只有具有相应权限的用户才能访问或操作这些数据。

可以通过在数据库中添加权限字段,并在查询数据时进行权限过滤来实现行级权限控制。

- 列级权限控制:对于某些字段,可以定义列级权限,只有具有相应权限的用户才能看到或修改这些字段的值。

可以通过在数据模型中添加权限字段,并在业务逻辑中进行权限判断来实现列级权限控制。

- 数据屏蔽:对于某些敏感数据,可以进行数据屏蔽,只有具有相应权限的用户才能看到这些数据。

可以通过在查询数据时进行数据过滤来实现数据屏蔽。

3. 功能层面的权限控制功能层面的权限控制是指对系统中的功能进行权限控制。

可以通过以下方法实现功能层面的权限控制:- 页面级权限控制:对于某些页面,可以定义页面级权限,只有具有相应权限的用户才能访问或操作这些页面。

可以通过在前端代码中进行权限判断来实现页面级权限控制。

- 按钮级权限控制:对于某些按钮或操作,可以定义按钮级权限,只有具有相应权限的用户才能看到或使用这些按钮。

可以通过在前端代码中进行权限判断来实现按钮级权限控制。

4. 数据权限的动态管理数据权限的管理应该是动态的,即可以根据用户的角色和权限进行实时的控制和调整。

JAVA权限管理及其实现思路

JAVA权限管理及其实现思路
进一步的思考是:操作包括“增删改查”四种操作,针对这每一种操作,需要一个 对应的“允许/禁止”标识。最直观和直接的考虑便是:ACL 针对每种操作设置一 个属性,和一个“允许/禁止”的标识。但是这种设计会造成灵活性的缺失。比如 有可能随着需求的变更,添加了其它的操作类型,那时候必须对 ACL 做必要的更 改才能适应需求的变化。为了适应这种可预见的需求,可将操作及其“允许/禁止” 标识设计如下: 在 ACL 中,设计一个 int 类型的状态位:aclState,在 Java 中,int 类型有 32 位,用位(bit)来表示操作类型(暂定:第 0 位表示“增”;第 1 位表示“删”; 第 2 位表示“改”;第 3 位表示“查”),位的值(对于“位”来说,只能取值 0 或 1)用来表示“允许/禁止”(0 表示禁止,1 表示允许)。这样,操作类型 及其“允许/禁止”标识便能合二为一,而且提高了灵活性(能支持将来可能 会增加的多达 32 种操作类型),因为对于某个模块而言,针对这个模块的操作 能够超过 32 个的情况,是几乎不会发生的,因此对这种特殊情况可以不予考 虑。
第一种解决办法限制太死,不够灵活;第二种解决办法,客户的反馈是不够方 便(需要不断切换);因此本设计方案将采取第三种解决办法
至此,用户与角色之间的设计思路便清晰起来:
再来看授权,可以把模块的增删改查操作授予某个角色或用户,并设置为允许或禁 止此操作。我们可以考虑使用授权控制列表来存储授权信息。现有需求下,授权的 主要要素是:一个是角色或用户;一个是模块;一个是操作;一个是允许/禁止。 这也就是授权控制列表(ACL)的主要要素。
客户要求在特殊的情况下,能够直接对用户进行授权。意思是不管其角色的授权如 何,始终采取针对用户的授权来作为最终的授权。而且,要求控制到的粒度是模块 (即可以针对某个模块设置给某用户单独的授权)。当然,在设置好授权之后,可

java数据权限设计方案

java数据权限设计方案

java数据权限设计方案数据权限是指系统根据用户的权限而对其所能访问或操作的数据进行控制和限制。

在Java中,可以通过以下方案来设计数据权限:1. 使用RBAC模型:RBAC(Role-Based Access Control)模型基于角色的访问控制,将用户分配给不同的角色,并将角色与数据权限进行关联。

在Java中,可以使用Spring Security框架实现RBAC模型,通过配置角色和权限的关系来实现数据权限的控制。

2. 使用动态SQL:动态SQL是指根据用户的权限动态生成SQL语句,从而实现对数据的访问控制。

在Java中,可以使用MyBatis框架来实现动态SQL,通过在SQL语句中加入判断条件,限制用户对数据的访问范围。

3. 使用注解和AOP:在Java中,可以使用注解和AOP (Aspect-Oriented Programming)来实现数据权限的控制。

通过在方法或类上添加注解,定义数据权限的范围和条件,然后使用AOP切面来拦截方法调用,并根据注解中的配置来判断用户是否有权限访问数据。

4. 使用数据库的行级别安全控制:某些数据库支持行级别安全控制(Row-Level Security),可以根据用户的角色或权限对表中的行进行控制。

在Java中,可以通过访问数据库的API 来实现对行级别安全控制的调用。

5. 使用缓存存储用户权限信息:将用户的权限信息缓存在内存或分布式缓存中,每次用户访问数据时,先从缓存中查询用户的权限,然后根据权限来过滤和限制数据的访问范围。

在Java中,可以使用Redis等缓存框架来实现用户权限的缓存。

总结起来,设计Java数据权限的方案可以使用RBAC模型、动态SQL、注解和AOP、数据库的行级别安全控制以及缓存存储用户权限信息等方法。

根据系统的需求和复杂程度,可以选择适合的方案来实现数据权限的控制和限制。

JAVA实现用户的权限管理

JAVA实现用户的权限管理

JAVA实现⽤户的权限管理
通常情况下,session中最好只保存⽤户的登陆信息,对于权限可以每次查询判断(⽤户量不⼤的情况下).或者定期查询,并放⼊缓存,进⾏判断. 对于问题中的情况,可以在更改权限后,⽴即更新zd⽤户权限缓存即可.
Java Web权限管理设计及实现
java实现⽤户权限模块两种⽅法
JAVA实现⽤户的权限管理(Shiro)
CRM权限管理(Java权限管理(授权与认证))
JAVA项⽬实现授权 (⼆)
JAVAWEB开发之权限管理(⼀)——权限管理详解(权限管理原理以及⽅案)、不使⽤权限框架的原始授权⽅式详解
【QQ登录】引导⽤户登录、授权,并请求已授权的临时token
使⽤STS进⾏临时授权
【License】java简单实现license认证-DES
微信公众号授权登录(java实现)
如何从零开始对接第三⽅登录(Java版):QQ登录和微博登录。

Java中的权限管理与身份验证

Java中的权限管理与身份验证

Java中的权限管理与身份验证在Java开发中,权限管理与身份验证是非常重要的部分,它们可以确保系统只允许合法用户进行相应的操作,并保护系统的安全性。

本文将探讨Java中的权限管理和身份验证的概念、原理和实践,以及相关的最佳实践方法。

1. 权限管理权限管理是控制系统中用户对资源的访问权限的过程。

在Java中,权限管理是通过安全管理器(SecurityManager)来实现的。

安全管理器是Java虚拟机的一部分,它是一个安全沙箱,控制着对敏感操作的访问权限。

1.1 权限控制Java中的权限控制是基于权限的概念,每个权限都对应一定的操作资源。

常见的权限包括读写文件、访问网络和执行特定的操作等。

通过为每个权限分配不同的级别,可以保证每个用户只能访问他们被授权的资源。

权限控制可以在代码中或者配置文件中进行定义和管理。

1.2 权限检查在Java中,可以使用AccessController类来进行权限检查。

AccessController提供了一种机制,用于检查是否允许执行具有特定权限的代码块。

使用AccessController可以确保只有具有所需权限的代码才能执行,从而提高系统的安全性。

2. 身份验证身份验证是确认用户的身份是否合法的过程,以确保系统只允许真实的用户访问敏感资源。

在Java中,身份验证可以通过不同的方法实现,包括基于密码、令牌、证书和生物特征等。

2.1 基于密码的身份验证基于密码的身份验证是最常见的身份验证方法之一。

它通过用户名和密码来验证用户的身份。

在Java中,可以使用Java的加密库来实现安全的密码存储和验证。

例如,可以使用Salted Hash算法对密码进行加密,并将加密后的密码存储在数据库中。

2.2 基于令牌的身份验证基于令牌的身份验证是一种无状态的身份验证方法,它使用令牌来表示用户的身份。

在Java中,可以使用JSON Web令牌(JWT)来实现基于令牌的身份验证。

JWT包含用户的声明信息和数字签名,有效地防止了令牌的篡改。

java后台 管理员 权限 设计 与 多种实现

java后台 管理员 权限 设计 与  多种实现

1. 概念权限控制有几个概念:用户、角色、资源、操作、许可一个用户可以拥有多个角色,一个角色可以对应多个用户,一个角色拥有对某些资源的操作,一个资源操作可以授予多个角色,那么哪个角色可以操作哪些资源记录在许可里。

2. 几个table参考Create table--用户表,存放用户信息create table SYS_USR(USR_ID VARCHAR(20) not null,USR_NAME VARCHAR(20),USR_PWD VARCHAR(30),USR_PWD_QUESTION VARCHAR(100),USR_PWD_ANSWER VARCHAR(100),USR_REMARK VARCHAR(255),USR_DISABLE_DATE DA TEtime,USR_EMAIL VARCHAR(50) not null,USR_CREATE_BY VARCHAR(20),USR_CREATE_DATE DATEtime,USR_UPDATE_BY VARCHAR(20),USR_UPDATE_DATE DATEtime)-- Create table--群组表,存放群组信息create table SYS_GROUP(GROUP_ID VARCHAR(20) not null,GROUP_NAME VARCHAR(50) not null,GROUP_REMARK VARCHAR(255),GROUP_CREATE_BY VARCHAR(20),GROUP_CREATE_datetime datetime,GROUP_UPdatetime_BY VARCHAR(20),GROUP_UPdatetime_datetime datetime,GROUP_DISABLE_datetime datetime)-- Create table--用户群组表,存放哪些用户属于哪个群组create table SYS_USR_GROUP(USR_ID VARCHAR(20) not null,GROUP_ID VARCHAR(20) not null,USR_GROUP_REMARK VARCHAR(255),USR_GROUP_CREATE_BY VARCHAR(20),USR_GROUPCREATE_datetime datetime,USR_GROUPUPdatetime_BY VARCHAR(20),USR_GROUPUPdatetime_datetime datetime)-- Create table-- 功能表,这里可以放页面create table SYS_FUNCTION(FUNC_ID VARCHAR(20) not null,FUNC_NAME VARCHAR(20),FUNC_FATHER_ID VARCHAR(20),FUNC_DESC VARCHAR(100),FUNC_REMARK VARCHAR(255),FUNC_DISABLE_datetime datetime,FUNC_CREATE_BY VARCHAR(20),FUNC_CREATE_datetime datetime,FUNC_UPdatetime_BY VARCHAR(20),FUNC_UPdatetime_datetime datetime)-- Create table-- 群组功能表,存放群组可以访问的页面create table SYS_GROUP_FUNC(GROUP_ID VARCHAR(20) not null,FUNC_ID VARCHAR(20) not null,GROUP_FUNC_REMARK VARCHAR(255),GROUP_FUNC_CREATE_BY VARCHAR(20),GROUP_FUNC_CREATE_datetime datetime,GROUP_FUNC_UPdatetime_BY VARCHAR(20),GROUP_FUNC_UPdatetime_datetime datetime)最后通过sql 语句串起来,可以得到一个用户属于哪个群组,这个群组又有访问哪些页面的权限,这样这个用户访问页面的权限就确定了.3. Filter实现<!--超级管理员--><filter><filter-name>adminCheck</filter-name><filter-class>com.tianhua.filter.AdminRightCheck</filter-class></filter><filter-mapping><filter-name>adminCheckUser</filter-name><url-pattern>/admin/user/*</url-pattern></filter-mapping><!--小权限管理员--><filter><filter-name>adminCheckUser</filter-name><filter-class>com.tianhua.filter.AdminRightCheckUser</filter-class> </filter><filter-mapping><filter-name>adminCheckUser</filter-name><url-pattern>/admin/user/*</url-pattern></filter-mapping>public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession session = req.getSession(true);AdminDto dto = (AdminDto) session.getAttribute("adminDto");if (dto == null) {res.sendRedirect(url);} else if (!"1".equals(dto.getAdminRightFlag())) {res.sendRedirect(url);} else {chain.doFilter(request, response);}}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession session = req.getSession(true);AdminDto dto = (AdminDto) session.getAttribute("adminDto");if (dto == null) {res.sendRedirect(url);} else if (!"1".equals(dto.getAdminRightFlag())) {res.sendRedirect(url);} else {chain.doFilter(request, response);}}4. Java用户角色权限设计实现业务系统中的用户权限管理B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。

如何在Java开发框架中实现权限控制

如何在Java开发框架中实现权限控制

如何在Java开发框架中实现权限控制权限控制在Java开发框架中是非常重要的一个功能。

实现权限控制可以保证系统的安全和稳定性,同时也是系统的一个重要体现。

本文将介绍在Java开发框架中如何实现权限控制。

1. 权限控制的基本概念权限控制是指在系统中控制用户对不同资源的访问权限,使得不同用户只能访问其具有访问权限的资源。

权限控制在系统安全中非常关键,它可以保证系统中敏感数据和功能只能被授权的用户访问和操作。

2. 实现权限控制的方法在Java开发框架中,实现权限控制可以采用以下方法:2.1. 基于角色的权限控制(RBAC)基于角色的权限控制是指通过赋予不同角色不同的权限来实现权限控制。

系统中定义多个角色,每个角色对应着不同的功能和访问权限,用户可以被分配到一个或多个角色,从而获得相应的权限。

在实现中,可以将角色和权限存储在数据库中,在用户登录时从数据库中读取用户权限信息,并根据不同角色对应的权限进行筛选和控制。

2.2. 基于资源的权限控制(ABAC)基于资源的权限控制是指通过定义资源和资源属性来实现权限控制。

资源可以是系统中的任何一个对象,如:文件、文件夹、数据库表、Web页面等等。

每个资源都有对应的属性,如:可读、可写、可执行等等。

在实现中,可以通过在代码中加入权限控制逻辑来实现基于资源的权限控制。

在每一次访问资源时,先通过用户ID、角色等信息确定用户的访问权限,然后根据资源对应的属性对用户的访问权限进行判断和控制。

2.3. 基于访问控制列表的权限控制(ACL)基于访问控制列表的权限控制是指通过给系统中的每个资源建立权限控制列表,控制哪些用户可以访问该资源,哪些用户不能访问该资源。

在实现中,可以通过创建访问控制列表对每个资源进行权限控制。

在每次访问资源时,系统会首先检查用户是否在访问控制列表中,如果用户在列表中则允许访问,否则拒绝访问。

3. 实际项目开发中的权限控制实现在实际项目开发中,我们一般将权限控制和身份认证结合起来,实现起来会比较方便和高效。

Java权限管理实践

Java权限管理实践

Java权限管理实践1. 概述在软件开发中,权限管理是一项重要的工作,它涉及到用户对系统资源的访问控制和管理。

在Java开发中,我们可以通过一些常用的权限管理实践来确保系统的安全性和可靠性。

本文将介绍几种Java权限管理的实践方法。

2. RBAC(Role-Based Access Control)角色-based访问控制RBAC是一种常见的权限管理模型,它将权限直接与用户角色相关联。

在RBAC中,用户被分配到一个或多个角色,而权限则与角色相关联。

这样的好处是,当用户角色发生变化时,只需修改角色的权限,而不需要修改每个用户的权限。

在Java中,我们可以使用RBAC模型来对系统进行权限管理,提高系统的安全性和可维护性。

3. 基于注解的权限管理在Java中,可以通过自定义注解来实现基于注解的权限管理。

我们可以使用自定义注解来标识哪些方法或类需要进行权限控制,并在程序运行时进行权限检查。

通过使用注解来实现权限管理,可以提高程序的可读性和灵活性。

4. 数据库级别的权限管理在Java开发中,数据的安全性是一项非常重要的工作。

为了保护数据库中的敏感数据,可以在数据库级别进行权限管理。

在数据库中,可以使用表级别的权限、列级别的权限等来控制用户对数据的访问。

通过合理设置数据库权限,可以确保敏感数据的安全性,提高系统的可靠性。

5. Spring Security框架Spring Security是一款非常流行的Java安全框架,它提供了一整套的身份验证、权限控制和安全措施。

通过使用Spring Security框架,我们可以轻松地实现权限管理功能。

它提供了丰富的API和配置选项,可以满足各种复杂的权限管理需求。

6. OAuth 2.0授权框架OAuth 2.0是一种开放标准的授权框架,用于授权第三方应用程序访问用户提供的资源。

在Java中,可以使用OAuth 2.0框架来实现安全的权限管理。

通过OAuth 2.0,用户可以授权第三方应用程序访问受保护的资源,同时保护用户的隐私和敏感数据。

Java权限管理(授权与认证)

Java权限管理(授权与认证)

Java权限管理(授权与认证)CRM权限管理有兴趣的同学也可以阅读我最近分享的:Shiro框架原理分析(PS : 这篇博客⾥⾯介绍了使⽤Shiro框架的⽅式实现权限管理)如果发现分享的内容有不合理或者的不对地⽅,请留⾔,我会及时定位分析,感谢!!!⼀、概念权限管理就是管理⽤户对于资源的操作。

本 CRM 系统的权限(也称作资源)是基于⾓⾊操作权限来实现的,即RBAC(Role-Based Access Control,基于⾓⾊的访问控制),就是⽤户通过⾓⾊与权限进⾏关联。

简单地说,⼀个⽤户拥有若⼲⾓⾊,每⼀个⾓⾊拥有若⼲权限。

这样,就构造成“⽤户-⾓⾊-权限”的授权模型。

在这种模型中,⽤户与⾓⾊之间,⾓⾊与权限之间都是多对多的关系,为了实现表之间多对多的关系,必须将⼀个多对多的关系通过⼀个中间表分为两个⼀对多的关系。

因此引⼊中间表,⽤户⾓⾊表和⾓⾊权限表。

⼆、数据库权限管理模块⼀共涉及五张表:1. 三张主表 a) ⽤户表(t_user)、 b) ⾓⾊表(t_role)、 c) 资源表(t_module)、2.两张中间表 a) ⽤户⾓⾊表(t_user_role)、 b) ⾓⾊—资源表(t_permission)、三、权限管理实现1、模块、⾓⾊、⽤户的单表CRUD 模块CRUD:操作t_module表 ⾓⾊CRUD:操作t_role表 ⽤户CRUD:操作t_role表2、授权⾓⾊赋予权限 给⾓⾊赋予权限:使⽤ztree进⾏权限树结构的构建a)赋权限1、先把本模块绑定; 2、绑定⽗模块; 3、绑定⼦模块b)删权限1、先删除本模块; 2、删除⼦模块; 3、删除⽗模块(判断⽗模块是否有其他的⼦模块关联词⾓⾊,如果没有就取消,如果有就关联)a) 使⽤jQuery的插件zTree构建⼀个资源的树结构,树中的内容为表t_module中的数据b) ⽤⿏标点击zTree中的选择框操作表t_permission(⾓⾊资源表)实现给⾓⾊赋予权限⽤户赋予⾓⾊ 给⽤户赋予⾓⾊:使⽤的combobox多选a).添加账号:直接往t_user_role插⼊记录b).修改账号:先删除,在添加创建⽤户或者是修改⽤户信息时都可以通过combobox多选框给⽤户赋予⾓⾊操作t_user_role(⽤户⾓⾊表)3、认证思路: 从t_permission表中获取权限值(acl_value)与页⾯传来的值或者与注解中明确的权限值⽐较,下⾯提供两种思路: 1.页⾯传递过来Request.getParameter(“permission”);⽐对根据userId查询数据库查到的权限列表 contains 2.通过注解明确模块权限值:@requirePermission(permission=”1010”;后台认证:Spring AOP和⾃定义注解实现认证 获取⽤户权限存⼊session,然后⽤户操作资源时会提交⼀个资源的权限值,在判断⽤户是否包含有此权限 使⽤Spring AOP进⾏拦截认证 第⼀步:开启注解驱动<aop:aspectj-autoproxy /> 第⼆步:创建⼀个代理类使⽤@Aspect @Component注解进⾏标记 第三步:定义⼀个切⼊点@Pointcut(" *execution('com.shsxt.controller.*.*((..))')") public void pointcut() {} 第四步:编写⼀个增强:@Around(value="pointcut()") 1.判定⽤户是否登录 2.获取⽤户权限 3.将权限存⼊session--》给前端页⾯判断 4.后台的权限校验 5.返回1. ⾃定义注解2.编写切⾯类定义切⼊点point:⾃拦截有权限注解的⽅法,更能提升性能//@Pointcut("execution(* com.shsxt.controller.*.*(..))")@Pointcut("@annotation(com.shsxt.annotation.RequirePermissions)")public void pointcut() {}通过前台传递permission参数实现:List<String> permissions = permissionService.findRolePermissions(roleIds.substring(0, stIndexOf(","))); String permissioFront = request.getParameter("permission"); // 后台权限认证AssertUtil.isTrue(!permissions.contains(permissioFront), "您⽆权操作此模块");通过注解实现List<String> permissions = permissionService.findRolePermissions(roleIds.substring(0, stIndexOf(",")));if (requirePermissions != null) {String permission = requirePermissions.permission(); // 后台权限认证throw new UnAuthPermissionException(permission, "您⽆权操作此模块");}3.引⼊AOP的namepsace并开启AOP注解驱动<!-- 启⽤@Aspect注解 --><aop:aspectj-autoproxy />4.在需要权限认证的⽅法上启⽤注解Permission应该和module表中的act_value保持⼀致前台认证:Freemarker 内建函数判断获取⽤户权限后在前端的freemarker中利⽤freemarker语法去判断⽤户是否能够操作此资源(list?seq_contains('权限值'))1.SQL:SELECTDISTINCT p.acl_valueFROMt_permission p-- LEFT JOIN t_role r ON r.id = ur.role_idleft JOIN t_user_role ur on p.role_id = ur.role_idWHEREer_id = 10;2.在AOP切⾯类中查询permission取出权限值列表、放⼊Session3.前台页⾯判断:解释:利⽤freemarker 内建函数sql_contains判断序列是否包含参数值,包含返回true类似于java中集合hashmap.contains(value);。

通用权限管理系统java权限处理及其实现思路

通用权限管理系统java权限处理及其实现思路

关键字: 用户权限管理B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。

因此B/S业务系统都需要有一个或多个权限系统来实现访问权限检测,让经过授权的用户可以正常合法的使用已授权功能,而对那些未经授权的“非法用户”将会将他们彻底的“拒之门外”。

下面就让我们一起了解一下如何设计可以满足大部分B/S系统中对用户功能权限控制的权限系统。

需求陈述∙不同职责的人员,对于系统操作的权限应该是不同的。

优秀的业务系统,这是最基本的功能。

∙可以对“组”进行权限分配。

对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是件耗时且不够方便的事情。

所以,系统中就提出了对“组”进行操作的概念,将权限一致的人员编入同一组,然后对该组进行权限分配。

∙权限管理系统应该是可扩展的。

它应该可以加入到任何带有权限管理功能的系统中。

就像是组件一样的可以被不断的重用,而不是每开发一套管理系统,就要针对权限管理部分进行重新开发。

∙满足业务系统中的功能权限。

传统业务系统中,存在着两种权限管理,其一是功能权限的管理,而另外一种则是资源权限的管理,在不同系统之间,功能权限是可以重用的,而资源权限则不能。

关于设计借助NoahWeb的动作编程理念,在设计阶段,系统设计人员无须考虑程序结构的设计,而是从程序流程以及数据库结构开始入手。

为了实现需求,数据库的设计可谓及其重要,无论是“组”操作的概念,还是整套权限管理系统的重用性,都在于数据库的设计。

我们先来分析一下数据库结构:首先,action表(以下简称为“权限表”),gorupmanager表(以下简称为“管理组表”),以及master表(以下简称为“人员表”),是三张实体表,它们依次记录着“权限”的信息,“管理组”的信息和“人员”的信息。

权限管理java实现(源于Linux中的权限管理算法)

权限管理java实现(源于Linux中的权限管理算法)

权限管理java实现(源于Linux中的权限管理算法)这个帖⼦由来已久吧,我也是到处搜到的,然后仔细学习,果然博⼤精深,然后加强点弄点⾃⼰的东西我已声明部分转载!!向⼤家介绍⼀种很不错,也是Linux中的权限管理算法。

定义a^b为:a的b次⽅ 假如,我们为每⼀个操作设定⼀个唯⼀的整数值,⽐如: 删除A---0 修改A---1 添加A---2 删除B---3 修改B---4 添加B---5 。

理论上可以有N个操作,这取决于你⽤于储存⽤户权限值的数据类型了。

这样,如果⽤户有权限:添加A---2;删除B---3;修改B---4 那⽤户的权限值 purview =2^2+2^3+2^4=28,也就是2的权的和了 化成⼆进制可以表⽰为11100 如果要验证⽤户是否有删除B的权限,就可以通过位与运算来实现。

在Java⾥,位与运算运算符号为& 即是:int value = purview &((int)Math.pow(2,3)); 你会发现,当⽤户有操作权限时,运算出来的结果都会等于这个操作需要的权限值! 原理: 位与运算,顾名思义就是对位进⾏与运算: 以上⾯的式⼦为例:purview &2^3 也就是 28&8 将它们化成⼆进制有 11100 & 01000 ------------------- 01000 == 8(⼗进制) == 2^3 同理,如果要验证是否有删除A---0的权限 可以⽤:purview &((int)Math.pow(2,0)); 即: 11100 & 00001 ------------------------ 00000 == 0(⼗进制) != 2^0 这种算法的⼀个优点是速度快。

可以同时处理N个权限,设置N种⾓⾊. 处理多个权限:如果想验证是否同时有删除A---0和删除B---3的权限 可以⽤purview&(2^0+2^3)==(2^0+2^3)?true:false; 处理多⾓⾊⽤户: 这⾥我多加⼀个⽰例,把问题说清楚,假设有四个⾓⾊,分别有多个不同的权限,多个权限构成⼀个⾓⾊⾓⾊1:删除A---0,修改A---1,添加A---2,查看A---3权限值2^0+2^1+2^2+2^3 = 15 ⼆进制1111⾓⾊2:删除B---4,修改B---5,添加B---6,查看B---7权限值2^4+2^5+2^6+2^7 = 240 ⼆进制11110000⾓⾊3:删除A---0,修改A---1,添加A---2,查看A---3,删除B---4,修改B---5,添加B---6,查看B---7权限值2^0+2^1+2^2+2^3 +2^4+2^5+2^6+2^7= 255 ⼆进制 11111111⾓⾊4:查看A---3,查看B---7权限值 2^3+2^7 = 136 ⼆进制 10001000某⼀个⽤户拥有⾓⾊1--1111和⾓⾊4---10001000 的权限,即⼆进制总权限要为10001111(2^0+2^1+2^2+2^3)| (2^3+2^7)=purview(⽤户总权限值) = 143根据权限值判断⽤户的⾓⾊,例如判断该⽤户有没有添加A和查看B的权限purview&(2^2+2^7)?true:false; 下⾯提供⼀个java的单操作权限判断的代码:Java代码//userPurview是⽤户具有的总权限//optPurview是⼀个操作要求的权限为⼀个整数(没有经过权的!)public static boolean checkPower(int userPurview, int optPurview){int purviewValue = (int)Math.pow(2, optPurview);return (userPurview &purviewValue) == purviewValue;}这是对多⾓⾊权限的模拟Java代码package com.authority;public class AuthorityCodeTest {/*** @param args*/public static void main(String[] args) {//⽤户具有的总权限int userPurview ;//⽤户拥有⾓⾊1和⾓⾊4的权限int power =(int)Math.pow(2, 0)+(int)Math.pow(2, 1)+(int)Math.pow(2, 2)+(int)Math.pow(2, 3);//15 int power4 =(int)Math.pow(2, 3)+(int)Math.pow(2, 7);//136userPurview =totolPower(power,power4);//143 ----10001111int[]optPurview = {2,7};//这⾥假设⽤户要执⾏2号添加A和7号操作查看Bboolean rs = checkPower(userPurview, optPurview);System.out.println(rs);}private static int totolPower(int i, int j) {return i|j;}//optPurview是操作要求的权限码整形数组,还没有经过权private static boolean checkPower(int userPurview, int[] optPurview) {int purviewValue =0;for (int i = 0; i < optPurview.length; i++) {int j = optPurview[i];purviewValue+= (int)Math.pow(2, j);}System.out.println("操作要求码:"+purviewValue);//132 ---10000100return (userPurview&purviewValue) == purviewValue;}}。

权限管理系统

权限管理系统

Java 实现权限管理系统
需求: 权限管理系统
1: 角色授权: 根据用户对应的角色,实现角色授予资源的过程即角色授权。

2: 用户授权: 根据用户本身,进行授予资源的过程即用户授权。

3: 在给用户分配权限的时候,首先要继承用户对应的角色的权限,然后再进行授权。

4: 当用户授权与角色授权矛盾时,用户授权优先级高于角色授权。

5: 系统初始时需要admins 用户的对应的权限。

应用场景: 如下
应用场景能满足以下两点:
A :某人属于某角色拥有100个菜单的权限,现在由于需求的变更此人对应的这100个菜单中有一个菜单不允许某人拥有,不能通过新增角色的方式授予此人权限,只能在通过用户授权操作进行改变。

B: 某人属于某角色拥有100个菜单的权限,现在需要对此人增加一个菜单,不能通过修改角色对应权限的菜单的方式变更,只能通过用户授权进行变更。

角色授权是粗粒度的授权,用户授权是细粒度的授权,在角色与用户授权发生矛盾时以人员授权的优先级高为标准。

资源表的说明: 资源表是一个统称: 一般包括三种资源 菜单资源,URL 资源,Button 资源 要分别进行授权 所以在资源操作表中要有resourcetype 字段进行区分到底是菜单,url ,还是Button 。

运行环境: jdk1.7
服务器: tomcat7.0
数据库: mysql
开发环境: eclipse
用户表 角色 用户角色表 资源表 资源操作表。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进一步的思考是:操作包括“增删改查”四种操作,针对这每一种操作,需要一个 对应的“允许/禁止”标识。最直观和直接的考虑便是:ACL 针对每种操作设置一 个属性,和一个“允许/禁止”的标识。但是这种设计会造成灵活性的缺失。比如 有可能随着需求的变更,添加了其它的操作类型,那时候必须对 ACL 做必要的更 改才能适应需求的变化。为了适应这种可预见的需求,可将操作及其“允许/禁止” 标识设计如下: 在 ACL 中,设计一个 int 类型的状态位:aclState,在 Java 中,int 类型有 32 位,用位(bit)来表示操作类型(暂定:第 0 位表示“增”;第 1 位表示“删”; 第 2 位表示“改”;第 3 位表示“查”),位的值(对于“位”来说,只能取值 0 或 1)用来表示“允许/禁止”(0 表示禁止,1 表示允许)。这样,操作类型 及其“允许/禁止”标识便能合二为一,而且提高了灵活性(能支持将来可能 会增加的多达 32 种操作类型),因为对于某个模块而言,针对这个模块的操作 能够超过 32 个的情况,是几乎不会发生的,因此对这种特殊情况可以不予考 虑。
统一控制;如果有效,则角色对此模块的授权将无法影响到拥有这个角色的用 户的授权。
实现 权限管理模块在实现上,有多个用例需要实现:管理模块信息、管理用户信息、管 理角色信息、给用户分配角色、给角色授权、给用户授权、获取用户授权列表、判 断用户对某个模块的某操作是否有允许授权 其中比较重要的是:授权、获取用户授权列表以及判断用户对某个模块的某操作是 否有允许授权 授权:可针对用户或角色授权,在授权界面上,根据系统现有模块,列出授权 树,可选择其中的某些模块和某些操作进行授权。因为鉴于授权界面的复杂性, 采取 DWR 来辅助实现授权界面。 获取用户授权列表:在用户登陆系统之后,需要根据用户的授权情况,获得用 户的授权列表,并根据用户的授权列表,在后台界面的导航菜单上显示出用户 拥有权限的模块,允许用户对这些模块进行操作。 判断用户对某个模块的某操作是否有允许授权:为了控制用户对模块的增删改 查操作,需要根据用户的授权情况,决定是否显示“增加”、“删除”、“修改” 等按钮或链接。我们采取自定义 JSTL 函数的方式来控制界面的显示!如:
权限管理及其实现思路
需求:oa 系统包含众多模块,要求能够通过权限管理,控制不同用户对模块的访问权 限,而且需要控制到(增删改查)CRUD 操作的级别。要求能通过角色对用户进行统一 授权,在某些特殊情况下,能够单独对用户进行授权。
分析 概念模型
设计: 在用户与角色的关系中,以用户为主来进行设计符合客户的使用习惯,即“将多个 角色授予某个用户(让用户拥有多个角色)”,比“将多个用户添加到某个角色上” 更加让人容易理解。 模块的授权以针对角色为主,即大部分的情况下,针对角色来分配模块的权限 一旦根据角色划分好权限之后,就可以进行用户的创建工作,同时可以给用户分配 角色(可以为多个),用户将拥有其所属角色的所有权限(这样就达到了统一控制 的目的) 由于一个用户可以拥有多个角色,系统无法对角色的授权进行控制(或者说无需对 其授权进行控制,因为为了给客户提供更大的灵活性),所以很有可能出现授权有 冲突的多个角色被授予同一个用户的情况,比如:角色 A 对模块 A 有删除权限, 但角色 B 对模块 A 的删除权限则被禁止,这时候,如果将角色 A 和角色 B 同时授 予用户 A,则会造成困扰,究竟用户 A 对模块 A 的删除权限是允许还是不允许? 它应该是以角色 A 的授权为准,还是应该以角色 B 的授权为准?针对这个问题, 可以考虑如下解决办法: 第一种解决办法是:如果多个角色之间有授权冲突,则不允许将这些角色同时 授予同一个用户,比如,在上述例子中,不允许将角色 A 和角色 B 同时授予 用户 A 第二种解决办法是:允许将有授权冲突的角色同时授予同一个用户,但用户在 某个时刻只能扮演其中的某个角色。在用户登陆后台管理界面之后,可以通过 切换角色,来执行不同的操作! 第三种解决办法是:允许将有授权冲突的角色同时授予同一个用户,对用户的 这些角色来说,有优先级的概念,当将角色分配给用户的时候,应该设置它的 优先级。同一个角色在不同的用户那里可能具有不同的优先级。当授权有冲突 的时候,以优先级更高的角色授权为准。
客户要求在特殊的情况下,能够直接对用户进行授权。意思是不管其角色的授权如 何,始终采取针对用户的授权来作为最终的授权。而且,要求控制到的粒度是模块 (即可以针对某个模块设置给某用户单独的授权)。当然,在设置好授权之后,可
பைடு நூலகம்
以在适当的时候再开放给用户使用。因此,这里有一个针对用户的授权是否有效的 问题。可采取添加另外一个 int 类型的状态位(aclTriState)的办法来满足这种需求。 这个额外状态位用-1 表示针对用户的授权无效;用 0 表示针对用户的授权有效。 之所以使用-1 和 0 来表示无效/有效,是因为-1 代表了一个 32 位全 1 的 int 类型值; 而 0 则代表了一个 32 位全 0 的 int 类型值。此设计隐含的意思是:aclTriState 的位 与 aclState 的位一致,而且某个位所表示的操作也是一致的,取 1 表示无效,取 0 表示有效(用 0 还是 1 来表示有效,这是无关紧要的事情)。这种设计是为了将来 可能扩展的需要。现在的需求是能对模块的授权控制其有效/无效即可,将来有可 能需要对模块的操作(增删改查)的授权控制其有效/无效。这种控制粒度更细。 如果要控制到更细的粒度,那么,aclTriState 可以取更多的状态值,来表示操作级 别的有效/无效。 有效/无效的意思是:如果无效,则用户对此模块的授权将受到其所属角色的
第一种解决办法限制太死,不够灵活;第二种解决办法,客户的反馈是不够方 便(需要不断切换);因此本设计方案将采取第三种解决办法
至此,用户与角色之间的设计思路便清晰起来:
再来看授权,可以把模块的增删改查操作授予某个角色或用户,并设置为允许或禁 止此操作。我们可以考虑使用授权控制列表来存储授权信息。现有需求下,授权的 主要要素是:一个是角色或用户;一个是模块;一个是操作;一个是允许/禁止。 这也就是授权控制列表(ACL)的主要要素。
<!-- login.id 表示当前登陆用户,’person’表示模块标识,3 代表删除操作 --> <c:if test="${my:hasPermission(login.id,'person',3) }">
<a href="#" onclick="del('person.do?method=del&id=${person.id }');">删除</a> </c:if>
相关文档
最新文档