我最近在JSP中开发了一个tomcat web应用程序,它使用绑定到公司Active Directory的声明性安全性(server.xml/web.xml).我被要求为刚刚起步的项目添加JSF支持.将登录表单转换为jsf是一件简单的事情,安全模型仍然有效.
一位员工询问我是否允许更广泛的受众查看其中一个报告,但仅为较小的组呈现操作按钮.作为JSF的新手,我不得不做一些研究.
我花了大约四个小时来搜索诸如"jsf按钮安全性"和"jsf按钮权限"之类的内容,并尝试了大多数死路一条的各种建议.另一位同事建议使用Spring安全模型,但如果有更简单的方法,我不想处理一大堆Spring库.
最后,我偶然发现了答案,这非常简单.我只需要使用HttpServletRequest方法:isUserInRole()来确定当前登录的用户是否有权查看操作按钮.在过去的十年里,我已经使用了很多HttpServletRequests,但我不记得曾经学过这种方法.使用jsf,获得该方法很简单,如下所示:
public boolean isUserInRole(String role) {
return (FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role));
}
Run Code Online (Sandbox Code Playgroud)
我的问题具体是:我是否应该注意这种方法的问题,还有另一种更简单的方法吗?
这是我在这里的第一篇文章.关于声明性Java EE安全性,我有两个问题:(1)基于文件的身份验证和(2)基于数据库的身份验证.我为这两个问题附上了配置的相关部分.我在Glassfish 3.1.1上运行代码.也提前感谢您的帮助.
我也在寻找我的问题的答案,并找到了一些有用的例子,我也把它放在信息的底部.我试图跟随它们,所以配置的当前状态可以包含这些样本的详细信息,但它们没有解决问题.
- 如果勾选了"默认主体到角色映射",则基于文件的身份验证可以正常工作,否则即使将主体添加到映射中它也不起作用.我可能没有以正确的方式配置某些东西.
基于-DB的身份验证.就授权而言,它无法正常工作,因为无法读取组名.详情见下文.身份验证可以正常工作,即用户被识别.我甚至尝试重命名表格以避免与Glassfish的一些内部内容发生潜在的名称冲突......
(1)基于文件的身份验证: 文件领域,2个用户:用户,管理员添加并分配给组:用户和管理员(配置/ server-config/security/realms /文件 - >管理用户)
配置/ server-config/security默认主体到角色映射"勾选" - >它的工作默认主体到角色映射"未勾选" - >即使将其添加到安全性映射,它也不起作用.
web.xml
[...]
<security-constraint>
<display-name>Admin Pages</display-name>
<web-resource-collection>
<web-resource-name>Protected Admin Area</web-resource-name>
<description/>
<url-pattern>/faces/admin/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<display-name>User Pages</display-name>
<web-resource-collection>
<web-resource-name>Protected Users Area</web-resource-name>
<description/>
<url-pattern>/faces/users/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<description/>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>file</realm-name>
<form-login-config>
<form-login-page>/faces/loginForm.xhtml</form-login-page>
<form-error-page>/faces/loginError.xhtml</form-error-page>
</form-login-config>
</login-config>
[...]
Run Code Online (Sandbox Code Playgroud)
glassfish-web.xml:
<glassfish-web-app>
<security-role-mapping>
<role-name>admin</role-name>
<group-name>admin</group-name>
</security-role-mapping> …Run Code Online (Sandbox Code Playgroud)