편집 : 일부 컨텍스트에서는 사용자 정의 보안 도메인을 사용하여 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;
}
}
이 문제는 JSF와 관련이 없으며 일반적으로 Java 웹 응용 프로그램과 관련이 있습니다. –
@LuiggiMendoza 감사합니다. 나는이 모든 것을 한 번에 배우기 때문에 그것을 모두 함께 생각하는 경향이 있습니다. – user1535568