2011-09-06 2 views
0

세션의 시작 부분에서 세션 변수를 잡고 결과에 따라 특정 페이지에 대한 액세스 만 허용하려는 간단한 사용 사례가 있습니다. 나는 모든 페이지에서 @Get 또는 @Post 메서드를 가로 채기 위해 bindInterceptor를 사용하여 가장 잘 수행되었거나 필터를 사용하는 것이 더 낫다는 것이 확실하지 않습니다. 여기에 내가 할 수 있지만하고 싶은 무엇을 스케치 대안에 개방하고 있습니다 :bindInterceptor와 guice 보안을위한 필터?

At the start of a new session (@SessionScoped ?), check a session variable authentication token 

If (authentication == admin) { 
    serveRegex("admin/(jsp|html)/.*").with(GuiceContainer.class); //only allow /admin subpages 
    req.getRequestDispatcher("/admin").forward(req, res); //fwd all initial page requests to /admin 
} 
else If (authentication == user) { 
    serveRegex("user/(jsp|html)/.*").with(GuiceContainer.class); //only allow /user subpages 
    req.getRequestDispatcher("/user").forward(req, res); //fwd all initial page requests to /user 
} 
else { 
    serveRegex("signin/(jsp|html)/.*").with(GuiceContainer.class); //only allow /signin subpages 
    req.getRequestDispatcher("/signin").forward(req, res); //fwd all initial page requests to /signin 
} 

어떤 기법이 보안 모델을 관리하기위한 선호 된 접근 (적어도 코드, 빠른, 등)? 나는 예제 프로젝트를보고 싶다.

도움 주셔서 감사합니다.

-john

답변

1

일반적인 방법은 필터를 사용하는 것입니다. URI 공간을 다른 필요한 권한에 맞게 분리하는 것으로 생각되면 이는 아마도 가장 쉬운 방법 일 것입니다. bindInterceptor 스타일은 메소드/클래스 ("@AdminRequired"등)에 선언 된 인증 로직을 원할 때 유용하지만 실제로 그렇게할만한 이유는 없습니다. URI 공간을 분리하는 것이 더 쉽습니다.

현재 사용자/권한 부여 논리를 가져 와서 사용 권한이 요청과 관련된 URI와 일치하는지 검사합니다.

예. 당신이해야합니다

class AuthenticationFilter implements Filter { 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    User user = getUserSomehow(); 
    if (user == null) { 
     response.sendRedirect(... login page ...); 
     return; 
    } 
    if (request.getRequestURI().startsWith("/admin")) { 
     // Enforce Admin login, error out otherwise. 
    } 
    // Proceed with executing the request. 
    chain.doFilter(request, response); 
    } 
} 

주 HttpServletRequest의/응답에 ServletRequest를/응답을 캐스팅합니다.