在我今天的项目中,我有一个登录+注销按钮,使用JSF Form身份验证和简单的XHTML j_security_check登录页面(使用primefaces进行布局)。
<form action="j_security_check" method="post">
<p:panelGrid id="loginContentPanel" columns="2">
<p:outputLabel for="j_username" value="Login" />
<p:inputText id="j_username" />
<p:outputLabel for="j_password" value="Password" />
<p:password id="j_password"></p:password>
<f:facet name="footer">
<div id="loginButtonCenter">
<h:commandButton id="loginButton"
styleClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
value="Login" />
</div>
</f:facet>
</p:panelGrid>
</form>
访问页面受到web.xml
中以下条目的限制<login-config>
<auth-method>FORM</auth-method>
<realm-name>User Auth</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/login.xhtml?s=err</form-error-page>
</form-login-config>
</login-config>
<security-constraint>
<web-resource-collection>
<web-resource-name>User Auth</web-resource-name>
<url-pattern>/admin/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
但是我被要求更改登录系统,所以它以这种方式工作:
我修改了web.xml以授予对所有角色的访问权限:
<security-constraint>
<web-resource-collection>
<web-resource-name>User Auth</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
</security-constraint>
但它仍然需要我至少有一个角色,而不仅仅是登录。 (我必须将登录页面更改为仅限html,因为我正在重定向到jquery样式文件(?))
我会问最好的方法,但是最好有封闭的问题,所以这里有一堆:
使用TomEE 1.7.3
答案 0 :(得分:1)
但它仍然要求我至少有一个角色,而不仅仅是登录。
只需添加代表“没有角色的用户”的角色,例如user
。管理员显然拥有这两个角色。
(我必须将登录页面更改为仅限html,因为我正在重定向到jquery样式文件(?))
/*
的网址格式适用于所有请求,包括JSF资源请求(来自WAR/resources
和WAR/WEB-INF/lib/*.jar!/META-INF/resources
的CSS / JS /图像文件)。要解决此问题,只需将/javax.faces.resource/*
网址格式添加到公开允许的资源集(即没有身份验证约束)。
<security-constraint>
<web-resource-collection>
<web-resource-name>Allowed resources</web-resource-name>
<url-pattern>/javax.faces.resource/*</url-pattern>
</web-resource-collection>
<!-- No Auth Contraint! -->
</security-constraint>
另见PrimeFaces CSS skin not showing in login page, also JavaScript undefined errors。
现在我的xhtml文件直接放在WebContent目录中,并放在admin目录的admin目录中。我应该将其余文件(登录页面除外)移动到例如用户目录,这样我只能限制项目区域并在登录页面上使用PF样式和图像吗?
没必要。只需将网址格式/*
约束为user
角色,/admin/*
约束admin
角色。
我读过有关过滤器的内容,因此我可以重定向未登录到登录页面的用户。它安全且无法中断吗? j_security_check对过滤器有效吗?
不要混合它们。过滤器仅适用于本土安全。另请参阅How to handle authentication/authorization with users in a database?此外,容器管理的安全性在第一个过滤器被命中之前运行很远,因此您无论如何也无法在过滤器中执行任何操作。另见a.o. Servlet filter not applying to container managed login page