PreAuthorize批注中的Java 8 / Spring常量

ale*_*oid 5 java spring spring-boot

在我的Spring Boot项目中,我定义了以下RestController方法:

@PreAuthorize("hasAuthority('" + Permission.APPEND_DECISION + "')")
@RequestMapping(value = "/{decisionId}/decisions", method = RequestMethod.PUT)
public DecisionResponse appendDecisionToParent(@PathVariable @NotNull @DecimalMin("0") Long decisionId, @Valid @RequestBody AppendDecisionRequest decisionRequest) {
    ....
    return new DecisionResponse(decision);
}
Run Code Online (Sandbox Code Playgroud)

现在,为了提供允许的授权机构名称,我使用以下代码构造:

@PreAuthorize("hasAuthority('" + Permission.APPEND_DECISION + "')")
Run Code Online (Sandbox Code Playgroud)

Permission.APPEND_DECISION常数在哪里:

public static final String APPEND_DECISION = "APPEND_DECISION";
Run Code Online (Sandbox Code Playgroud)

Java / Spring中是否还有任何更优雅的方式来定义这种代码?

Sto*_*ney 8

这是在单个位置定义权限的简单方法,不需要任何深入的 Spring Security 配置。

public class Authority {
    public class Plan{
        public static final String MANAGE = "hasAuthority('PLAN_MANAGE')";
        public static final String APPROVE = "hasAuthority('PLAN_APPROVE')";
        public static final String VIEW = "hasAuthority('PLAN_VIEW')";
    }
}
Run Code Online (Sandbox Code Playgroud)

保障服务...

public interface PlanApprovalService {

    @PreAuthorize(Authority.Plan.APPROVE)
        ApprovalInfo approvePlan(Long planId);

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 优雅的解决方案 (3认同)

ale*_*oid 5

感谢oli37,我通过以下方式实现了这个逻辑:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {

    private DefaultMethodSecurityExpressionHandler defaultMethodExpressionHandler = new DefaultMethodSecurityExpressionHandler();

    @Override
    protected MethodSecurityExpressionHandler createExpressionHandler() {
        return defaultMethodExpressionHandler;
    }

    public class DefaultMethodSecurityExpressionHandler extends org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler {

        @Override
        public StandardEvaluationContext createEvaluationContextInternal(final Authentication auth, final MethodInvocation mi) {
            StandardEvaluationContext standardEvaluationContext = super.createEvaluationContextInternal(auth, mi);
            ((StandardTypeLocator) standardEvaluationContext.getTypeLocator()).registerImport(Permission.class.getPackage().getName());
            return standardEvaluationContext;
        }
    }

}


    @PreAuthorize("hasAuthority(T(Permission).APPEND_DECISION)")
    @RequestMapping(value = "/{decisionId}/decisions", method = RequestMethod.PUT)
    public DecisionResponse appendDecisionToParent(@PathVariable @NotNull @DecimalMin("0") Long decisionId, @Valid @RequestBody AppendDecisionRequest decisionRequest) {
    ...
        return new DecisionResponse(decision);
    }
Run Code Online (Sandbox Code Playgroud)