仅将应用程序限制为JSF中的已记录用户

时间:2016-01-11 14:26:52

标签: java-ee jsf-2 primefaces login

在我今天的项目中,我有一个登录+注销按钮,使用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样式文件(?))

我会问最好的方法,但是最好有封闭的问题,所以这里有一堆:

  • 现在我的xhtml文件直接放在WebContent目录中,并放在admin目录的admin目录中。我应该将其余文件(登录页面除外)移动到例如用户目录,这样我只能限制项目区域并在登录页面上使用PF样式和图像吗?
  • 我读过有关过滤器的内容,因此我可以重定向未登录到登录页面的用户。它安全且无法中断吗? j_security_check对过滤器有效吗?
  • 是否甚至可以仅使用应用程序web.xml文件将应用程序限制为已记录的用户?

使用TomEE 1.7.3

1 个答案:

答案 0 :(得分:1)

  

但它仍然要求我至少有一个角色,而不仅仅是登录。

只需添加代表“没有角色的用户”的角色,例如user。管理员显然拥有这两个角色。

  

(我必须将登录页面更改为仅限html,因为我正在重定向到jquery样式文件(?))

/*的网址格式适用于所有请求,包括JSF资源请求(来自WAR/resourcesWAR/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