`

chx 学习jForum笔记三

阅读更多

2010.12.6 接上周日,继续。

PermissionControl pc = SecurityRepository.get (userId); //权限控制
if (pc.canAccess (SecurityConstants.PERM_FORUM, Integer.toString(forum.getId()))) {
  forums.add(forum); //如果有权控制板块,则添加到返回列表
}

正如字面意思pc是权限控制,先看net.jforum.security/PermissionControl.java

private RoleCollection roles;//权限集合
private transient GroupSecurityDAO smodel;//组权限数据表


这里有两个属性,一个是权力集合,一个是组权限数据表,暂时没看懂有什么用。

public boolean canAccess(String roleName, String roleValue)
{
Role role = this.roles.get(roleName);
if (role == null) {
   return false;
}
return role.getValues ().contains(new RoleValue(roleValue));
}

根据Category.java中的调用语句看,canAccess()的两个参数,一个是'perm_fourm',另一个是板块的ID。而在canAccess()这里,先根据perm_fourm获取一个Role,rol.getValues()是什么?

根据net.jforum.security/role.java
 public RoleValueCollection getValues()
{
return this. roleValues ;
}

private final RoleValueCollection roleValues = new RoleValueCollection();

就是说,一个role 对应多个RoleValue ,而fourm_id也可能是一个RoleValue
pc.canAccess()就是判断role中是否包含指定的RoleValue。

再根据本页第一句,看net.jforum.security/SecurityRepository.java

public static PermissionControl get(int userId)
{   //从缓存中读权限控制
PermissionControl pc = (PermissionControl)cache.get(FQN, Integer.toString(userId));
if (pc == null) { //缓存中没有
try {
pc = load (userId);  //取用户权限
}
catch (Exception e) {
throw new SecurityLoadException(e);
}
}

public static PermissionControl load(int userId)
{
return SecurityRepository. load (userId, false);
}

好绕啊。

  public static PermissionControl load(int userId, boolean force)
{
if (force || cache.get(FQN, Integer.toString(userId)) == null) { //强制重取或缓存中没有
UserDAO um = DataAccessDriver.getInstance().newUserDAO();
return SecurityRepository. load (um.selectById(userId), force);
}
return SecurityRepository.get(userId);
}

再看
  public static PermissionControl load(User user, boolean force)
{
String userId = Integer.toString(user.getId());
if (force || cache.get(FQN, userId) == null) {  //强制重取或缓存中没有
PermissionControl pc = new PermissionControl();
// load roles
GroupSecurityDAO dao = DataAccessDriver.getInstance().newGroupSecurityDAO();
pc.setRoles(dao. loadRolesByUserGroups (user));  //从用户所在的组中取权限
cache.add(FQN, userId, pc);
return pc;
}
return SecurityRepository.get(user.getId());
}

再找doa.loadRolesByUserGroups(),在net.jforum.dao.generic.security\GenericGroupSecurityDAO.java中

public RoleCollection loadRolesByUserGroups(User user)
{
List groups = user.getGroupsList();  //取用户的所有组
// When the user is associated to more than one group, we
// should check the merged roles
int[] groupIds = this.getSortedGroupIds(groups);  //对组排序
RoleCollection groupRoles = RolesRepository.getGroupRoles(groupIds); //从缓存中根据组取权限
// Not cached yet? then do it now
if (groupRoles == null) { //缓存中没有
groupRoles = this. loadRoles (groupIds); //从数据表中取所有组的权限
RolesRepository.addGroupRoles(groupIds, groupRoles);  //将所有组ID及组权限写入缓存中
}
return groupRoles;
}

再看从数据表中取组权限的过程:

protected RoleCollection loadRoles(int[] groupIds) //从数据表中取所有组的权限
{
String sql = SystemGlobals.getSql("PermissionControl.loadGroupRoles");  //取sql语句
String groupIdAsString = SecurityCommon.groupIdAsString(groupIds); //将组ID转成适合SQL语句的字符型
if ("".equals(groupIdAsString)) {
// We suppose there is no "negative" group ids
sql = sql.replaceAll("#IN#","-1");
}
else {  //将组ID加入SQL语句。
sql = sql.replaceAll("#IN#", groupIdAsString);
}
RoleCollection roles = null;
PreparedStatement p = null;
ResultSet rs = null;
try {
p = JForumExecutionContext.getConnection().prepareStatement(sql);
rs = p.executeQuery();
roles = SecurityCommon. loadRoles (rs); //将SQL执行结果转为roles
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(rs, p);
}
return roles;
}

查看net.jforum.dao.generic.security/SecurityCommon.java
  public static RoleCollection loadRoles(ResultSet rs)
{
RoleCollection rc = new RoleCollection();
try {
Role r = null;
String lastName = null;
while (rs.next()) {
String currentName = rs.getString("name'); //当前规则名称
if (!currentName.equals(lastName)) { //当前规则名称与最后规则名称不同
if (r != null) {
rc.add(r);  //将规则加入返回集,首次不同由于r的初始值为null,因此不会加入
}
r = new Role();
r.setName(rs.getString("name"));  //设置规则名称,那么ID呢?没看到设置role的ID啊。
lastName = currentName; //最后规则名称刷新为当前规则名称
}
String roleValue = rs.getString("role_value");
if (!rs.wasNull() && StringUtils.isNotBlank(roleValue)) {
r.getValues().add(new RoleValue(roleValue)); //设置role的rolevalue
}
}
if (r != null) {
rc.add(r);//将循环后最后一个role放入结果集
}
return rc;
}
catch (SQLException e) {
throw new DatabaseException(e);
}
}

 

总结一下,role中有多个rolevalue.取权限的语句在"PermissionControl.loadGroupRoles" 中。

分享到:
评论

相关推荐

    chx 学习jForum笔记十八 jForum与ms sqlserver

    《jForum与MS SQLServer整合学习笔记》 jForum是一款基于Java的开源论坛系统,它以其高度可定制性、灵活性和强大的功能深受开发者喜爱。在本文中,我们将深入探讨如何将jForum与Microsoft SQL Server(简称MS SQL...

    chx99个人主页源码_chx99.zip

    【标题】"chx99个人主页源码_chx99.zip" ...通过深入学习和分析 chx99 的个人主页源码,不仅可以提升我们的前端开发技能,还可以借鉴其设计思路,为自己的项目提供灵感。同时,这也是一种尊重和学习开源精神的方式。

    CHX TNF JNK之间的关系

    这一研究聚焦于理解CHX(环己亚胺)、TNFα以及JNK(c-Jun N端激酶)三者之间的复杂关系,以及它们如何共同作用于人类肝癌细胞的凋亡过程。 ### CHX(环己亚胺) 环己亚胺(Cycloheximide,CHX)是一种蛋白质合成...

    chx2095中文 英文资料

    - 对于特定的输入频率,输出端口会显示不同倍数的输入频率电平,例如1xFin、2xFin、3xFin、4xFin和5xFin。 - 输入端口和输出端口的电压驻波比(VSWR)均为2.5:1,表明电路具有良好的阻抗匹配。 ### 技术细节 - ...

    CHX-I防火墙官方教程-附带翻译终稿.pdf

    CHX-I防火墙官方教程-附带翻译终稿.pdf

    [CMS程序]chx99个人主页源码_chx99(ASP.NET源码).rar

    总之,通过对【CMS程序]chx99个人主页源码_chx99(ASP.NET源码)的深入研究,我们可以学习到ASP.NET Web Forms的开发技术,数据绑定,用户认证,配置管理,以及前端交互等多个方面,这将对提升我们的ASP.NET开发技能...

    CHX

    此外,对于初学者来说,阅读和理解CHX的源代码也是一个很好的学习C语言和理解十六进制编辑器工作原理的机会。 总的来说,CHX 是一款实用的终端工具,它的轻量级设计和高度可定制性使其成为开发人员和系统管理员的...

    CHX-3大手臂大法兰.SLDDRW

    CHX-3大手臂大法兰.SLDDRW

    HA-SoftEther-CHX虚拟专网

    HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网

    chx99个人主页源码

    7. **第三方服务集成**:个人主页可能集成社交媒体API、评论系统、统计分析工具,如Google Analytics,以提升用户体验和跟踪网站表现。 8. **SEO优化**:源码应考虑搜索引擎优化(SEO),包括元标签、友好的URL结构...

    CHX612.zip

    这篇文章将详细讲解与"CHX612.zip"压缩包相关的知识点,主要涉及HX612触摸IC、STC15W408AS微控制器以及相关编程与接口技术。 首先,我们关注的是HX612,这是一款触摸传感器集成电路。不同于常见的I2C接口,HX612...

    [CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载

    [CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载[CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载[CMS程序]chx99个人主页源码_chx99.zip源码ASP.NET网站源码打包下载[CMS程序]...

    Chx.rar_最优化_最优化方法_梯度优化_梯度法

    在给定的“Chx.rar”压缩包中,包含的主题是“最优化方法”和“梯度优化”,特别是“梯度法”。这表明压缩包里的资源可能涉及如何使用梯度信息来优化复杂问题的解决方案。 首先,我们要理解“最优化”是什么。最...

    ASP.NET源码——[CMS程序]chx99个人主页源码.zip

    总的来说,"ASP.NET源码——[CMS程序]chx99个人主页源码.zip"是一个宝贵的学习资源,不仅展示了ASP.NET在实际项目中的应用,也提供了实践和理解Web开发最佳实践的机会。无论是初学者还是经验丰富的开发者,都能从中...

    \HA-SoftEther-CHX虚拟网卡及教程

    本软件是一个模似网卡和集线器的工具,可以模似集线器功能,实现VPN的功能。使得系统把此软件识别成一块网卡,有了这个东西,只要可以访问外网,都可以连接到虚拟HUB上与其他电脑组成局域网,在此虚拟的局域...

    程序源码 chx99个人主页源码_chx99(ASP.NET源码).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    北大计算机系高级计算机系统结构课件chx14-arch03-ilp1

    在本课件中,主要讨论了三种数据相关类型:真数据相关(Data dependences)、名字相关(Name dependences)以及控制相关(Control dependences)。 1. **真数据相关(Data Dependences)**:这种相关指的是指令i的...

    CHX-I防火墙官方教程-附带翻译借鉴.pdf

    CHX-I防火墙官方教程-附带翻译借鉴.pdf

    ASP.NET-[CMS程序]chx99个人主页源码.zip

    通过研究这个源码,学习者不仅可以了解ASP.NET的基本概念和编程技巧,还可以深入理解CMS系统的架构和工作原理,对提升Web开发技能大有裨益。同时,如果你是个人站长,这个源码可以作为搭建自己个性化主页的起点,...

Global site tag (gtag.js) - Google Analytics