2011-04-28 230 views
3

我試圖在登錄後實現重定向,這意味着我不能再使用glassfish內置的表單身份驗證設置來自動處理這些事情。首先,我需要在請求受保護的頁面時控制重定向到登錄頁面。據我所知,這是用過濾器完成的。這個方法可以與web-xml中的安全約束結合嗎?實際上,我的過濾器根本沒有被調用,因爲glassfish只是接管並拋出用戶的基本登錄框,即使沒有設置登錄配置,也會忽略所有過濾器。基本上,我沒有設法在用戶登錄之前調用過濾器,當在glassfish中配置安全約束時。如何使用Java EE 6實現重定向到登錄頁面/ Glassfish

我是否真的需要在過濾器中手動完全接管安全措施才能正常工作?如果是這樣的話,這個實現看起來很可怕。

使用glassfish 3.1和JSF 2以及使用request.login手動登錄的自定義登錄頁面。

web.xml。

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <param-value><!--Production-->Development</param-value> 
    </context-param> 
    <context-param> 
     <param-name>com.sun.faces.expressionFactory</param-name> 
     <param-value>de.odysseus.el.ExpressionFactoryImpl</param-value> 
    </context-param> 
    <filter-mapping> 
     <filter-name>LoginFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 
    <filter> 
     <filter-name>LoginFilter</filter-name> 
     <filter-class>com.xdin.competence.jsf.util.LoginFilter</filter-class> 
    </filter> 
    <session-config> 
     <session-timeout>60</session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>index.jsf</welcome-file> 
    </welcome-file-list> 
    <!--<error-page> 
     <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
     <location>/viewExpired.jsf</location> 
    </error-page>--> 
    <security-constraint> 
     <display-name>ManagerArea</display-name> 
     <web-resource-collection> 
      <web-resource-name>ManagerArea</web-resource-name> 
      <description/> 
      <url-pattern>/manager/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>Manager-role</role-name> 
      <role-name>Admin-role</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>EmployeeArea</display-name> 
     <web-resource-collection> 
      <web-resource-name>EmployeeConstraint</web-resource-name> 
      <description/> 
      <url-pattern>/user/Overview.jsf</url-pattern> 
      <url-pattern>/user/PrepareReport.jsf</url-pattern> 
      <url-pattern>/user/Search.jsf</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>Employee-role</role-name> 
      <role-name>Admin-role</role-name> 
      <role-name>Manager-role</role-name> 
      <role-name>OKIF-role</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>AdminArea</display-name> 
     <web-resource-collection> 
      <web-resource-name>AdminCompetence</web-resource-name> 
      <description/> 
      <url-pattern>/admin/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>Admin-role</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <security-constraint> 
     <display-name>UserArea</display-name> 
     <web-resource-collection> 
      <web-resource-name>UserConstraint</web-resource-name> 
      <description/> 
      <url-pattern>/index.jsf</url-pattern> 
      <url-pattern>/template.jsf</url-pattern> 
      <url-pattern>/user/UserDetail.jsf</url-pattern> 
      <url-pattern>/user/UserInformation.jsf</url-pattern> 
      <url-pattern>/print/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <description/> 
      <role-name>Employee-role</role-name> 
      <role-name>Admin-role</role-name> 
      <role-name>Manager-role</role-name> 
      <role-name>OKIF-role</role-name> 
     </auth-constraint> 
    </security-constraint> 
    <!--<login-config> 
     <auth-method>FORM</auth-method> 
     <form-login-config> 
      <form-login-page>/login.jsf</form-login-page> 
      <form-error-page>/login.jsf</form-error-page> 
     </form-login-config> 
    </login-config>--> 
    <security-role> 
     <description/> 
     <role-name>Employee-role</role-name> 
    </security-role> 
    <security-role> 
     <description/> 
     <role-name>Admin-role</role-name> 
    </security-role> 
    <security-role> 
     <description/> 
     <role-name>Manager-role</role-name> 
    </security-role> 
    <security-role> 
     <description/> 
     <role-name>OKIF-role</role-name> 
    </security-role> 
</web-app> 

我的過濾器:

public class LoginFilter implements Filter { 

    private FilterConfig filterConfig = null; 

    public LoginFilter() { 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
         FilterChain chain) 
     throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest)request; 
     HttpServletResponse res = (HttpServletResponse)response; 
     if (req.getUserPrincipal() == null) { 
      req.getSession().setAttribute("from", req.getRequestURI()); 
      res.sendRedirect("/login.jsf"); 
     } else { 
      chain.doFilter(request, response); 
     } 

    } 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void init(FilterConfig filterConfig) { 
     this.filterConfig = filterConfig; 
    } 

} 
+0

*「我試圖在登錄後實現重定向」*,是不是j_security_check會自動處理?它應該這樣做。 – BalusC 2011-04-28 13:24:30

+0

我正在使用自定義的基於表單的登錄,並使用手動的request.login,因此沒有使用j_security_check。 – 2011-04-28 14:41:53

+0

啊,我明白了。 – BalusC 2011-04-28 14:51:20

回答

5

您的自定義登錄表單,添加以下隱藏字段:

<input type="hidden" name="from" value="#{requestScope['javax.servlet.forward.request_uri']}" /> 

您在JSF如下

@ManagedProperty(value="#{param.from}") 
private String from; 
設置

並在登錄acti中重定向如下on方法

if (from != null) { 
    externalContext.redirect(from); 
} 

不需要Filter

+0

是否有可能以某種方式在會話範圍的託管bean中使用它?我有我的登錄功能在我登錄的同一班上。 – 2011-04-28 15:01:25

+0

好吧,用'externalContext.getRequestParameterMap()。get(「from」)'來代替它。 – BalusC 2011-04-28 15:02:15

+0

嗯,第一次嘗試沒有工作,明天會嘗試更多。謝謝。 – 2011-04-28 15:05:40