2010-12-01 4 views

답변

9

보안 모듈로는이 작업을 수행 할 수 없습니다. Niels가 말한 것처럼 보안 모듈은 솔루션보다 하나의 예입니다. @Before 주석으로 자신 만의 보안 시스템을 구축 할 수 있습니다. 다음은 예입니다.

public class Admin extends Controller { 

@Before(unless={"login", "authenticate", "logout", "otherMethod"}) 
void checkAccess() { 
    // check the cookie 
} 

public void login() { 
    render(); 
} 

public void authenticate(String email, String password) { 
    // check the params and set a value in the cookie 
} 

public void logout() { 
    // delete cookie 
} 

보안 모듈의 소스 코드를 읽는 것이 좋습니다.

+0

보안 모듈을 사용하여이 작업을 수행 할 수도 있습니다. 내 대답을 확인하십시오. –

0

보안 컨트롤러의 @ Before-Tag에 값을 설정할 수 있습니다. 보안 모듈은 솔루션보다 하나의 예입니다.

+0

보안 모듈은 내가 원하는 모든 것을 할 수있을 정도로 확장 성이있는 것 같습니다. 내가 아직 발견하지 못한 다른 단점이 있습니까? –

1

내가 찾고있는 것을 얻기 위해 Check 주석을 복사하여 Public 주석을 만들었습니다. 그들에게 @Public 주석을 추가하여 로그인하지 않고 지금 With(Secure.class)를 사용하여 컨트롤러의 조치가 접근 할 수

if (getActionAnnotation(Public.class) != null) 
    return; 

:

package controllers; 

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface Public { 

} 

는 내가 Secure.checkAccess의 시작 부분에 두 줄을 추가했다.

4

저는 이전에 @Public 솔루션이 상속 된 동작을 처리 할 수 ​​없으므로 다소 제한적이라는 것을 알았습니다. 내가 대신 클래스 레벨의 주석에 갔어요 :

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
public @interface AllowGuest { 

    String[] value(); 
} 

Secure.checkAccess() 방법의 시작 부분에이 코드를 추가 :

AllowGuest guest = getControllerInheritedAnnotation(AllowGuest.class); 
if (guest != null) { 
    for (String action : guest.value()) { 
     if (action.equals(request.actionMethod)) 
      return; 
    } 
} 

과 같이 사용할 수 있습니다 @AllowGuest({"list","view"})

이렇게하면 로컬 및 상속 된 작업에 대한 액세스를 허용하고 컨트롤러의 어떤 작업이 안전하지 않은지 확인할 수 있습니다.

2

컨트롤러에 @With(Secure.class) 주석을 제거하고이 코드를 컨트롤러에 추가하십시오.

@Before(unless={"show"}) 
static void checkAccess() throws Throwable { 
    Secure.checkAccess(); 
} 

여기에서 show은 공개적으로 사용할 수있는 조치입니다.

관련 문제