在JSP页面中小脚本访问的授权框架使用枚举(Scriptlets in a JSP Page to

2019-10-30 07:43发布

所以我基本上找提醒我如何能改进的解决方案。

一些背景首先,

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

当他们的用户日志通过基于其分配的角色的用户权限对象。 (默认为始终拒绝)。 这些权限包括一个主题(ENUM)以及可选的权限(创建,读取,更新,删除...)的列表中。

在一些地方,这是用来控制屏幕元素的显示,在别人与策略模式相结合来控制基于用户角色的系统行为。

在JSP层通过我访问小脚本,因为在代码完成选项可以确保用户不输入,这不是在框架中定义的值。

代码示例:

<% 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
<% } %>

我很好奇,找到的是是否有更好的方法来做到这一点? 我听到的口头禅,“你不应该使用小脚本。一切都应该与JSTL和自定义标签来完成”。

然而,在我看来,通过使用自定义标签我失去使用代码完成和执行框架的合同的优势。 对我来说,字符串传递到自定义标签只增加了额外的抽象层(一个抽象的框架),并增加了一个错误,因为我们现在用简单的字符串工作的机会。

有没有一种方法来创建,将采取枚举的参数或者一个替代的解决方案避免这种完全的自定义标签?

Answer 1:

你可以使用EL这一点。 要做到这一点的方法是首先导入核心标签库,通过把这个在你的JSP视图的头。

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

把你的主题+许可(个),一个HashMap用户,并进行功能调用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>


文章来源: Scriptlets in a JSP Page to Access an Authorization Framework Using Enums