我有一个定义了安全约束的JSF2(GlassFish 3.0)应用程序(下面的示例)。 我的问题是,我有一个"注册"链接,当用户登录时应该无法访问。
也就是说,如果他们尝试点击"/signup.jsf",如果他们被登录,他们应该能够访问;所以如果有任何角色,他们应该无法看到页面。
有没有办法做这样的"反向"安全约束?
欢迎任何建议,谢谢!抢
我的应用程序中的示例约束,如果有用:
<security-constraint>
<display-name>profileForm</display-name>
<web-resource-collection>
<web-resource-name>profileForm</web-resource-name>
<url-pattern>/profileForm.jsf</url-pattern>
<http-method>DELETE</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>GENERAL</role-name>
<role-name>ADMIN</role-name>
<role-name>STAFF</role-name>
<role-name>INSTRUCTOR</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
只需创建一个完全可以做到这一点的Filter
。
@WebFilter(urlPatterns={"/signup.jsf"})
public class SignupFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// ...
if (userIsLoggedIn) {
((HttpServletResponse) response).sendRedirect("already_loggedin.jsf");
} else {
chain.doFilter(request, response);
}
}
// ...
}
实际上,标准 JSF 在授权/身份验证方面没有提供任何现成的东西。JSF 只是一个基于组件的 MVC 框架。
另请参阅:
- 我们的 Servlet 过滤器 wiki 页面