0

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

一些背景首先,

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

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

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

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

代码示例:

<% 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 和自定义标签来完成”。

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

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

4

1 回答 1

0

您可以为此使用 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>
于 2013-07-18T21:09:40.240 回答