如何创建自定义Web安全表达式以在JSP中使用?

时间:2018-09-16 22:15:56

标签: java spring-mvc spring-security

如何创建自己的Web安全表达式,这样我就可以在JSP文件中使用它,例如:

Sub test()

Dim copySheet As Worksheet: Set copySheet = Worksheets("Data")
Dim pasteSheet As Worksheet: Set pasteSheet = Worksheets("Print")

copySheet.Range("J11:Q11").Copy
pasteSheet.Range("B" & pasteSheet.Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues

End Sub

2 个答案:

答案 0 :(得分:1)

这就是您需要的。 请按照以下步骤创建自定义SpEL表达式:

1)创建 WebSecurityExpressionRoot 类的自定义子类。在此子类中,创建一个将在表达式中使用的新方法。例如:

public class CustomWebSecurityExpressionRoot extends WebSecurityExpressionRoot {

    public CustomWebSecurityExpressionRoot(Authentication a, FilterInvocation fi) {
        super(a, fi);
    }

    public boolean yourCustomMethod() {
        boolean calculatedValue = ...;

        return calculatedValue;

    }
}

2)创建 DefaultWebSecurityExpressionHandler 类的自定义子类,并覆盖方法 createSecurityExpressionRoot(Authentication authentication,FilterInvocation fi) (而不是createEvaluationContext(...))返回其中的 CustomWebSecurityExpressionRoot 实例。例如:

@Component(value="customExpressionHandler")
public class CustomWebSecurityExpressionHandler extends DefaultWebSecurityExpressionHandler {

    @Override
    protected SecurityExpressionRoot createSecurityExpressionRoot(
            Authentication authentication, FilterInvocation fi) {

        WebSecurityExpressionRoot expressionRoot = new CustomWebSecurityExpressionRoot(authentication, fi);

        return expressionRoot;
}}

3)在spring-security.xml中定义对表达式处理程序bean的引用

<security:http access-denied-page="/error403.jsp" use-expressions="true" auto-config="false">
    ...

    <security:expression-handler ref="customExpressionHandler"/>
</security:http>

此后,您可以使用自己的自定义表达式来代替标准表达式:

<security:authorize access="yourCustomMethod()">

答案 1 :(得分:0)

我建议您使用Shiro框架。
官方链接:http://shiro.apache.org /
AuthorizingRealm实现extends,然后在doGetAuthorizationInfo(...)中添加安全控制的表达式。
在JSP中,首先添加Shiro JSP标记库,官方链接:http://shiro.apache.org/web.html#Web-taglibrary

使用<shiro:hasPermission name="...">...</shiro:hasPermission>可以控制您需要的东西。 name属性是一个表达式,它将与您在AuthorizingRealm中设置的内容进行比较。

以下是权限表达指南:http://shiro.apache.org/permissions.html

这里是一些用法:

<%@ taglib prefix="shiro" uri=http://shiro.apache.org/tags %>
<html>
<body>
    <shiro:hasPermission name="users:manage">
        <a href="manageUsers.jsp">
            Click here to manage users
        </a>
    </shiro:hasPermission>
    <shiro:lacksPermission name="users:manage">
        No user management for you!
    </shiro:lacksPermission>
</body>
</html>