2012-08-15 5 views
3

편집 : 일부 컨텍스트에서는 사용자 정의 보안 도메인을 사용하여 request.login을 수동으로 호출합니다. 표준 FORM 인증을 사용하지 않습니다.JBoss EAP6/AS7의 보안 제한 이전 필터 적용

편집 : 내가 정말 찾고 있어요 것은 보스 대신 j_security_check의 구성 사용자 정의 <security-domain>를 사용하여 <login-config> 기능을 복제하는 방법입니다 것 같다 .

내 웹 앱에서 두 가지 다른 작업을 수행 할 수 있어야합니다. 먼저, 사용자 인증 여부를 결정할 수 있어야하며, 로그인 페이지로 리디렉션하고 싶지 않은 경우 나는 이것을 위해 필터를 사용하고있다. 둘째, 웹 응용 프로그램의 특정 페이지를보기 위해 사용자의 역할이 올바른지 여부를 결정해야합니다. web.xml 파일의 security-constraint 태그가이 작업을위한 적절한 도구 인 것처럼 보이지만이 규칙은 필터 전에 항상 먼저 적용됩니다. 즉, 적절한 역할이 없기 때문에 사용자가 페이지에 대한 액세스가 거부되기 전에 로그인 할 수있는 기회가 주어지지 않습니다.

내가 생각할 수 있었던 유일한 해결책은 security-constraint를 사용하는 대신 필터에서 사용자 역할을 수동으로 검사하는 것이지만 좋은 해결책이라고 생각하지 않습니다. 이 글이 아주 흔한 유스 케이스 인 것처럼 보이기 때문에 내가 여기에 빠져있는 것이 있는지 궁금하다. 참고로 내 필터와 샘플 보안 제약 조건이 아래에 붙여 넣어집니다.

편집 : 당신은 단지 특정 오류에 대해 하나의 오류 페이지를 정의 할 수 있기 때문에 내가 허가를 확인하기 위해 필터를 사용하고 그 이유는 (이 경우, 403 액세스가 거부). 예를 들어, "고객"역할을 가진 누군가는 searchCustomer 페이지에 액세스하려고 시도합니다. 내 보안 제한 조건은 해당 페이지를 "admin"또는 "user"역할의 사용자로 제한하므로 403 오류가 생성되고 사용자는 구성된 오류 페이지 인 error.xhtml로 리디렉션됩니다. 로그인하지 않은 두 번째 사용자는 main.xhtml을 방문하려고 시도합니다. 그는 로그인하지 않았기 때문에 허용 된 3 가지 역할 중 하나가 부족하기 때문에 403 오류를 수신하고 error.xhtml로 리디렉션됩니다. 그러나 그는 로그인하지 않았으므로 대신 로그인 페이지로 리디렉션하는 것이 좋습니다. 보안 제약 조건과 오류 페이지를 사용하여이 두 가지 유스 케이스를 구별 할 수있는 방법이 없습니다.

<security-constraint> 
    <display-name>SecureApplicationConstraint</display-name> 
    <web-resource-collection> 
     <web-resource-name>SecureApplication</web-resource-name> 
     <description>SecureApplication</description> 
     <url-pattern>/main.xhtml</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
     <role-name>user</role-name> 
     <role-name>customer</role-name> 
    </auth-constraint> 
</security-constraint> 
    <security-constraint> 
    <display-name>SearchCustomerPage</display-name> 
    <web-resource-collection> 
     <web-resource-name>SecureApplication</web-resource-name> 
     <description>SecureApplication</description> 
     <url-pattern>/searchCustomer.xhtml</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>admin</role-name> 
     <role-name>user</role-name> 
    </auth-constraint> 
</security-constraint> 
<error-page> 
    <error-code>403</error-code> 
    <location>/error.xhtml</location> 
</error-page> 

은 필터 :

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest req = (HttpServletRequest) request; 
    String uri = req.getRequestURI(); 

    if ((null != req.getUserPrincipal()) 
      || uri.endsWith("login.xhtml") 
      || uri.endsWith("error.xhtml") 
      || uri.contains(ResourceHandler.RESOURCE_IDENTIFIER)) { 
     chain.doFilter(request, response); 
    } else { 
     HttpServletResponse res = (HttpServletResponse) response; 
     res.sendRedirect(req.getContextPath() + "/login.xhtml?from=" + URLEncoder.encode(uri, "UTF-8")); 
     return; 
    } 
} 
+0

이 문제는 JSF와 관련이 없으며 일반적으로 Java 웹 응용 프로그램과 관련이 있습니다. –

+0

@LuiggiMendoza 감사합니다. 나는이 모든 것을 한 번에 배우기 때문에 그것을 모두 함께 생각하는 경향이 있습니다. – user1535568

답변

3

당신은 다른 보스가 먼저이 API를 활성화하는 데 필요한 몇 가지 이유로 들어 자바 EE 6

이 사용 JASPI/JASPIC API를 할 수 그러나 그들은 이것을 수행하는 방법에 대한 위키 페이지를 가지고 있습니다.

+0

감사합니다. 이것이 내가 필요한 것입니다. – user1535568