6.2.5.2. 会话属性

访问组可以为组中的用户定义用户会话属性。这些属性可以在设置约束时使用,也可以在其他应用程序代码中使用。

当用户登录时,用户访问组的所有属性集合,以及组以上树形层级的属性集合都会被置于用户会话中。如果不同树形层级有相同的属性,最上层的会生效。所以,不可能在低树形层级组中覆盖属性值。如果发现有覆盖倾向,会在服务器日志中记录一条警告日志。

在定义 访问组 的类中,也可以同时定义约束和会话属性。该类需位于 core 模块。下面是一个访问组的例子,其中定义了 accessLevel 会话属性值为 1

@AccessGroup(name = "Level 1", parent = RootGroup.class)
public class FirstLevelGroup extends AnnotatedAccessGroupDefinition {

    @SessionAttribute(name = "accessLevel", value = "1", javaClass = Integer.class)
    @Override
    public Map<String, Serializable> sessionAttributes() {
        return super.sessionAttributes();
    }
}

会话属性也可以在运行时通过 Access Groups - 访问组 界面定义:选择一个访问组然后切换到其 Session Attributes - 会话属性 标签页。

会话属性可在代码中通过 UserSession 对象访问:

@Inject
private UserSessionSource userSessionSource;
...
Integer accessLevel = userSessionSource.getUserSession().getAttribute("accessLevel");

使用 session$ 前缀,会话属性可以在约束中做为 JPQL 参数使用:

{E}.accessLevel = :session$accessLevel