스프링 보안과 grails를 사용하면 별 어려움없이이 작업을 수행 할 수 있습니다.
나는 유사한 작업을 위해 과거에 다음 두 가지 방법을 사용했습니다. 둘 다 @PreAuthorize
및 @PostAuthorize
주석을 제공하는 봄 보안 ACL 플러그인이 필요합니다.
사용자 정의 PermissionEvaluator는
당신은 보안 주석 내에서 hasPermission()
방법을 사용하여 사용자 정의 PermissionEvaluator
을 만들 수 있습니다. 코드 내에서 이것은 다음과 같습니다
@PreAuthorize("hasPermission(#myObject, 'update')")
public void updateSomething(myObject) {
..
}
hasPermission()
통화 봄 보안에 의해 PermissionEvaluator
로 라우팅됩니다. 자신의 구현을 작성하려면이 PermissionEvaluator
인터페이스를 구현해야합니다 :
class MyPermissionEvaluator implements PermissionEvaluator {
@Override
public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
// your custom logic..
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
// your custom logic
}
}
등록하는 PermissionEvaluator
당신이 expressionHandler
라는 이름의 빈을 무시해야합니다. 당신은 conf/spring/resources.groovy
에 다음 행을 추가하여이 작업을 수행 : 봄을 사용할 때 applicationContext.xml
에서하는 것처럼 resources.groovy
내
beans = {
expressionHandler(MyExpressionHandler) {
parameterNameDiscoverer = ref('parameterNameDiscoverer')
permissionEvaluator = ref('myPermissionEvaluator') // your PermissionEvaluator
roleHierarchy = ref('roleHierarchy')
trustResolver = ref('authenticationTrustResolver')
}
myPermissionEvaluator(MyPermissionEvaluator)
}
당신은 빈을 정의 할 수 있습니다. 위의 행은 빈 이름이 myPermissionEvaluator
인 MyPermissionEvaluator
유형의 빈을 작성합니다. 봄 증권 expressionHandler
bean은 MyExpressionHandler
유형의 bean으로 대체됩니다.다른 종속성은 스프링 보안 ACL 플러그인의 구성 파일에서 복사됩니다. hasPermission()
방법의 설계가 모든 사용자의 요구 사항이 간단한 서비스가 대신 호출을 사용할 수 achive하지 않는 경우
서비스
보안 주석에 호출합니다. @PostAuthorize
및 @PreAuthorize
주석은 SPEL을 사용하여 표현식을 평가합니다. SPEL에서 @
기호를 사용하여 빈에 액세스 할 수 있습니다. 예를 들어 :
는
@PreAuthorize("@securityService.canAccess(#myObject)")
public void doSomething(myObject) {
..
}
이 securityService
라는 이름의 bean의 canAccess
메서드를 호출하고 여기에 메소드 인수를 전달합니다.
당신이
EvaluationContext에
BeanResolver을 등록해야이 방법을 사용합니다. 이렇게하려면 봄 보안 ACL 플러그인에 의해 구성된
DefaultMethodSecurityExpressionHandler을 무시해야합니다.
이 다음과 같이 할 수 있습니다 resources.groovy
에 콩을 추가 마침내
class GrailsBeanResolver implements BeanResolver {
GrailsApplication grailsApplication
@Override
public Object resolve(EvaluationContext evaluationContext, String beanName) throws AccessException {
return grailsApplication.mainContext.getBean(beanName)
}
}
그리고 :
class MyExpressionHandler extends DefaultMethodSecurityExpressionHandler {
BeanResolver beanResolver
@Override
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
StandardEvaluationContext ctx = (StandardEvaluationContext) super.createEvaluationContext(auth, mi)
ctx.setBeanResolver(beanResolver) // set BeanResolver here
return ctx;
}
}
BeanResolver
는 빈 인스턴스에 빈 이름을 확인하는 간단한 인터페이스입니다
expressionHandler(MyExpressionHandler) {
parameterNameDiscoverer = ref('parameterNameDiscoverer')
permissionEvaluator = ref('permissionEvaluator')
roleHierarchy = ref('roleHierarchy')
trustResolver = ref('authenticationTrustResolver')
beanResolver = ref('beanResolver') // this is your BeanResolver
}
// This is the service called within security expressions
// If you place your service in the grails service folder you can skip this line
securityService(MySecurityService)
// this is your BeanResolver
beanResolver(GrailsBeanResolver) {
grailsApplication = ref('grailsApplication')
}
UPDAT 전자 (2013년 10월 22일는) : 최근에 나는 몇 가지 추가 정보를 제공하는 정확히 이것에 대해 blog post을 썼다.
확실하지가 가장 좋은 방법입니다,하지만 난 필터를 통해 수행 한 대한 보안 당신은 말하고있다. –
응답 @ JamesKleeh 주셔서 감사합니다. 컨트롤러 동작 만 필터링하는 데 문제가 있습니까? – mnd
아니, 나는 그런 식으로 할 수없는 일에 빠지지 않았다. 그 밖의 무엇을 확보 할 수 있습니까? 정적 콘텐츠? –