JSP页面中使用枚举访问授权框架的Scriptlet



所以我基本上是在寻找如何改进解决方案的建议。

一些背景第一,

我开发了一个简单的内部授权框架来控制基于Java/J2EE的应用程序中的访问和行为,该框架可以用于任何模型、视图或控制器层。

当用户登录时,会根据其分配的角色向他们传递一个"用户权限"对象。(默认为始终拒绝)。权限包括主题(枚举)以及可选权限列表(创建、读取、更新、删除…)

在某些地方,它用于控制屏幕元素的显示,在另一些地方,它与策略模式相结合,根据用户的角色控制系统行为。

在JSP层中,我通过Scriptlets访问它,因为CodeComplete选项确保用户不会输入框架中未定义的值。

代码示例:

<% if (user.can(Permission.somePermission, Subject.subjectOfPermission)) {  %>
    <td >
            ...display something if the User can Access the Subject
    </td>
<% } %>
<% if (user.cannot(Permission.somePermission, Subject.subjectOfPermission)) {  %>
        ...display something if the User cannot Access the Subject
<% } %>

我好奇的是,是否有更好的方法可以做到这一点?我听过一句口头禅,"你不应该使用scriptlet。一切都应该用JSTL和自定义标签来完成"。

然而,在我看来,通过使用自定义标签,我失去了使用代码完整以及执行框架合同的优势。对我来说,将字符串传递给自定义标记只会为(抽象框架)增加一层额外的抽象,并增加出错的可能性,因为我们现在使用的是简单的字符串。

有没有一种方法可以创建将Enum作为参数的自定义标记,或者有一种完全避免这种情况的替代解决方案?

您可以使用EL。实现这一点的方法是首先导入核心标记库,将其放在jsp视图的头部。

<%@ taglib prefix="c" 
       uri="http://java.sun.com/jsp/jstl/core" %>

将该用户的主题+权限放在哈希图中,并创建一个函数hasPermission,该函数返回该用户是否拥有该权限。

class User {
    private HashMap<String, List<String>> permissionMap;
    public boolean hasPermission(String subject, String action) {
        return permissionMap.getValue(subject).contains(action);
    }
}

在servlet中,您必须使用将用户对象放在请求的属性中

request.setAttribute("user", userObject);

之后,您可以在视图中这样访问它们。

<c:choose>
    <c:when test="${user.hasPermission('Record', 'create')}">
    // Code when access granted
    </c:when>
    <c:otherwise>
    // Code when access denied
    </c:otherwise>
</c:choose>

最新更新