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

THE*_*all 3 java spring-mvc spring-security

如何创建您自己的 Web 安全表达式,以便我能够在 JSP 文件中使用它,例如:

<sec:authorize access="isOwner()"> some content here </sec:authorize>
Run Code Online (Sandbox Code Playgroud)

Ali*_*ien 5

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

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

public class CustomWebSecurityExpressionRoot extends WebSecurityExpressionRoot {

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

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

        return calculatedValue;

    }
}
Run Code Online (Sandbox Code Playgroud)

2) 创建DefaultWebSecurityExpressionHandler类的自定义子类并覆盖其中的方法createSecurityExpressionRoot(Authenticationauthentication, FilterInitation 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;
}}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

之后,您可以使用自己的自定义表达式而不是标准表达式:

<security:authorize access="yourCustomMethod()">
Run Code Online (Sandbox Code Playgroud)