반응형
사전 승인 주석의 Java 8/Spring 상수
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);
}
지금은 허용된 권한 이름을 제공하기 위해 다음 코드 구조를 사용합니다.
@PreAuthorize("hasAuthority('" + Permission.APPEND_DECISION + "')")
어디에Permission.APPEND_DECISION
상수:
public static final String APPEND_DECISION = "APPEND_DECISION";
그런 종류의 코드를 정의하기 위해 자바/스프링에서 더 우아한 방법이 있습니까?
다음은 심층적인 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')";
}
}
서비스 보호 중...
public interface PlanApprovalService {
@PreAuthorize(Authority.Plan.APPROVE)
ApprovalInfo approvePlan(Long planId);
}
}
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);
}
둘 다 섞지 않는 것이 좋은 방법이라고 생각합니다.
상수를 가질 수 있습니다.
public static final String ROLE_ADMIN = "auth_app_admin";
그리고 다른 면을 가지고 있습니다.
@PreAuthorize("hasRole(\"" + Constants.ROLE_ADMIN + "\")")
이것은 매우 명백합니다.
언급URL : https://stackoverflow.com/questions/41891329/java-8-spring-constants-in-preauthorize-annotation
반응형
'programing' 카테고리의 다른 글
Python 요청 라이브러리 새 URL 리디렉션 (0) | 2023.07.23 |
---|---|
SQLite에서 Oracle INSTR 교체 (0) | 2023.07.23 |
런타임 경고: 분할에서 잘못된 값이 발견되었습니다. (0) | 2023.07.23 |
java에서 oracle sql 스크립트 실행 (0) | 2023.07.23 |
Javascript 스위치 vs. if... 그렇지 않으면... (0) | 2023.07.23 |