我有一个正在使用的Java Web应用程序正在通过使用SSO(SPNEGO)令牌进行身份验证。在Multitenancy WebLogic Server(12.2.1.2)中设置了安全领域和提供程序,并且除调用isUserInRole之外,其他一切似乎都正常运行。它总是返回false。正在对用户进行身份验证,正在创建主题,并使用AD中的所有正确主体(组)填充主题。 我尝试将Principals映射到weblogic.xml文件中的安全角色分配,并在web.xml中使用该角色分配尝试将角色映射到特定的Principal(组),但是它不起作用,正如我认为的那样
该应用程序由WAR中的一个servlet组成,如果身份验证成功,该servlet应该在屏幕上显示登录信息。身份验证成功,并显示信息,我可以从AD和我所属的所有主体(组)中看到我的名字。
weblogic.xml和web.xml的配置如下。
weblogic.xml
<security-role-assignment>
<role-name>SITE_ADMIN</role-name>
<principal-name>@DEV_ADMIN</principal-name>
<principal-name>DEV_ADMIN</principal-name>
</security-role-assignment>
web.xml
<servlet>
<servlet-name>AuthSimpleTestServlet</servlet-name>
<servlet-class>functional.test.SimpleTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AuthSimpleTestServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>secured pages</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>SITE_ADMIN</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>myrealm</realm-name>
</login-config>
<security-role>
<description>Admin Role</description>
<role-name>SITE_ADMIN</role-name>
</security-role>
当我使用浏览器测试身份验证时,我便已通过身份验证,并且servlet显示我的用户名,所有主体和一些其他信息,就像我已经通过身份验证时一样。
请求的URL: http://dev-server:7011/CHAD/SPNEGO_TEST
请求信息:
请求方法:GET
请求URI:/ CHAD / SPNEGO_TEST
请求协议:HTTP / 1.1
Servlet路径:
路径信息:
路径翻译:
查询字符串:
内容长度:
内容类型:
服务器名称:dev-server
服务器端口:7011
远程用户:DCConway
方案:http
授权方案:CLIENT_CERT
请求方案:http
请求主体:DCConway
尝试使用HttpServletRequest.authenticate进行身份验证:true
HttpServletRequest.isUserInRole(SITE_ADMIN):false
Weblogic用户名-> weblogic.security.SubjectUtils.getUsername(Subject):DCConway
该学科的负责人数量:47
主体列表:(为帖子编辑的列表)
DCConway
DEV_ADMIN
@DEV_ADMIN
请求标头:
接受:text / html,application / xhtml + xml,image / jxr, /
接受语言:美国
用户代理:Mozilla / 5.0(Windows NT 10.0
WOW64
Trident / 7.0
rv:11.0)像壁虎
接受编码:gzip,deflate,peerdist
主机:dev-server:7011
DNT:1
连接:保持活动
Cookie:JSESSIONID = YAAx-omzQbMg4jE-bedCM-5Guwngj56xAmXVIqhcbFSJxti7Ae6J!2096529829
授权:协商YIILJAYG .....
X-P2P-PeerDist:版本= 1.1
X-P2P-PeerDistEx:MinContentInformation = 1.0,MaxContentInformation = 2.0
请求属性:
weblogic.servlet.network_channel.port:type = java.lang.Integer str ='7011'
在通过身份验证的结果中,我可以看到使用servlet请求来获取远程用户是可行的。我可以看到使用Principal来获取用户名是可行的。使用servlet请求调用身份验证是可行的,并且我可以看到我的所有主体。我现在不知所措,试图找出为什么对isUserInRole的调用未返回true。我猜想从角色映射到委托人的某些内容是不正确的,但我还看不到我搞砸了。
我想我可以使用这些原理来使安全性起作用并基于这些原理来限制用户的安全性,但是我真的很想知道弄乱映射的内容和位置,或者是因为在AD中没有定义任何角色组。任何解释都将不胜感激。