假设我有3个角色admin和来宾
我有40页
--views
------page1.xhtml1
------page1.xhtml2
------page1.xhtml3
------page1.xhtml4
------ ......
管理员可以访问所有页面
访客不能只访问页面1,2和3 <security-constraint>
<display-name>excluded</display-name>
<web-resource-collection>
<web-resource-name>No Access</web-resource-name>
<url-pattern>/views/page1.xhtml</url-pattern>
<url-pattern>/views/page2.xhtml</url-pattern>
<url-pattern>/views/page3.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint />
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
此代码示例将停止对第1,2和3页的所有角色的访问,但我想要的是停止仅为角色来宾访问这些页面
答案 0 :(得分:0)
您忘记在<auth-constraint>
中设置角色。这样,没有人能够访问这些资源。您需要在那里设置允许访问这些资源的角色。如果您的管理员角色的调用与此admin
完全相同,那么应该执行以下操作:
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
如果尚未完成,请不要忘记将该角色注册为<security-role>
:
<security-role>
<role-name>admin</role-name>
</security-role>
答案 1 :(得分:0)
首先,您需要在servlet容器中配置一个安全域,这将允许容器对数据库,LDAP服务器,纯文本文件等执行身份验证。查看servlet容器的文档,因为这是每件事都非常具体。
然后,您必须将配置登录到web.xml
,作为起点,您会对BASIC
登录类型感到满意(以验证容器是否正确验证用户),但稍后您要#39;我想拥有自己的登录表单。基本登录配置是这样的:
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
请注意,您必须在那里设置实际安全领域的名称,即servlet容器中配置的名称。
然后是使用<security-constraint />
标记配置访问权限(当前代码段中包含的内容)。如果您希望仅允许某些用户访问您应用的某些部分,则需要在<auth-constraint />
标记中添加角色名称。如下所示:
<auth-constraint>
<role-name>ADMIN</role-name>
<role-name>MODERATOR</role-name>
</auth-constraint>
您还需要配置安全角色:
<security-role>ADMIN</security-role>
<security-role>MODERATOR</security-role>
某些容器甚至会要求您将一些特定于servlet的配置文件添加到/WEB-INF
文件夹中,在该文件夹中将安全领域中的实际用户组映射到应用程序中的角色名称(它们可以是相同的名称) ,但他们也没有)。同样,这是特定于servlet的容器,因此您需要检查servlet容器的配置。
我添加了一些链接以供进一步阅读: