创建委托登录模块(用于JBoss EAP 6.1)

[如果只想查看代码,请向下滚动]

动机

在RHQ中,我们需要一个安全域,该域可用于通过容器管理的安全性来保护REST-api及其Web应用程序。 过去,我只是使用经典的DatabaseServerLoginModuleDatabaseServerLoginModule进行身份验证。 现在RHQ还允许将用户包含在LDAP目录中,而上述模块未涵盖这些目录。 我有两个选择开始:

  • 将LDAP登录模块复制到REST的安全域中
  • 将安全域用于已经用于UI和CLI的REST-api

后一种选择当然有利于防止代码重复,所以我走了那条路。 并失败了。

我失败了,因为RHQ在启动时删除并重新创建了安全域,并且服务器检测到该错误并抱怨从rhq-rest.war引用的安全域突然消失了。

因此,下一个尝试:不要在启动时重新创建域,而仅添加/删除ldap-login模块(我说的是模块,因为实际上我们需要两个)。

这也没有按预期工作:

  • 基础AS有时会进入需要重新加载的模式,并且未应用更改
  • 除去ldap模块后,它们中的主体仍被缓存
  • 刷新缓存不起作用,服务器进入需要重新加载的模式

因此,我现在要做的是为rest-security-domain实现一个登录模块,该模块仅委派给另一个进行身份验证,然后在成功时添加角色。

这样,rhq-rest.war便具有对该rest-security-domain的固定引用,而另一个安全域则可以像以前一样处理。

实作

让我们从standalone.xml文件中的代码段开始,该代码段描述安全域并参数化模块

<security-domain name="RHQRESTSecurityDomain" cache-type="default"><authentication><login-module code="org.rhq.enterprise.server.core.jaas.DelegatingLoginModule" flag="sufficient"><module-option name="delegateTo" value="RHQUserSecurityDomain"/><module-option name="roles" value="rest-user"/></login-module></authentication></security-domain>

因此,此定义设置了一个安全域RHQRESTSecurityDomain ,该域使用我将在稍后描述的DelegatingLoginModule。 传递了两个参数:

  • proxyTo:要验证用户身份的另一个域的名称
  • 角色:以逗号分隔的要添加到主体的模块列表(以及web.xml的security-constraint部分中需要的模块)

对于代码,我没有显示完整清单。 你可以在git中找到它 。

为了使我们的生活更轻松,我们并没有自己实现所有功能,而是扩展了现有的UsernamePasswordLoginModule并仅覆盖某些方法。

public class DelegatingLoginModule extends UsernamePasswordLoginModule {

首先,我们使用传递的选项初始化模块,并使用我们委派给的域创建一个新的LoginContext:

@Overridepublic void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,Map<String, ?> options) {super.initialize(subject, callbackHandler, sharedState, options);/* This is the login context (=security domain) we want to delegate to */String delegateTo = (String) options.get("delegateTo");/* Now create the context for later use */try {loginContext = new LoginContext(delegateTo, new DelegateCallbackHandler());} catch (LoginException e) {log.warn("Initialize failed : " + e.getMessage());}

有趣的部分是login()方法,在该方法中我们获取用户名/密码并将其存储以供以后使用,然后我们尝试登录到委托域,如果成功,则告诉super我们成功了,以便它可以发挥作用。 。

@Overridepublic boolean login() throws LoginException {try {// Get the username / password the user entred and save if for later useusernamePassword = super.getUsernameAndPassword();// Try to log in via the delegateloginContext.login();// login was success, so we can continueidentity = createIdentity(usernamePassword[0]);useFirstPass=true;// This next flag is important. Without it the principal will not be// propagatedloginOk = true;

这里需要loginOk标志,以便超类将调用LoginModule.commit()并选择主体和角色。

不将其设置为true将导致成功login()但没有附加主体。

if (debugEnabled) {log.debug("Login ok for " + usernamePassword[0]);}return true;} catch (Exception e) {if (debugEnabled) {LOG.debug("Login failed for : " + usernamePassword[0] + ": " + e.getMessage());}loginOk = false;return false;}}

成功后,super将调用以下两种方法来获取主体及其角色:

@Overrideprotected Principal getIdentity() {return identity;}@Overrideprotected Group[] getRoleSets() throws LoginException {SimpleGroup roles = new SimpleGroup("Roles");for (String role : rolesList ) {roles.addMember( new SimplePrincipal(role));}Group[] roleSets = { roles };return roleSets;}

现在,最后一部分是回调处理程序,我们委托的其他域将使用该回调处理程序从我们那里获取凭据。 它是经典的JAAS登录回调处理程序。 首先让我感到困惑的一件事是,该处理程序在登录期间被调用了几次,我认为这是错误的。 但是实际上,它被调用的次数与RHQUserSecurityDomain中配置的登录模块的数量相对应。

private class DelegateCallbackHandler implements CallbackHandler {@Overridepublic void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {for (Callback cb : callbacks) {if (cb instanceof NameCallback) {NameCallback nc = (NameCallback) cb;nc.setName(usernamePassword[0]);}else if (cb instanceof PasswordCallback) {PasswordCallback pc = (PasswordCallback) cb;pc.setPassword(usernamePassword[1].toCharArray());}else {throw new UnsupportedCallbackException(cb,"Callback " + cb + " not supported");}}}}

同样,完整的代码在RHQ git仓库中可用。

调试(在EAP 6.1 alpha或更高版本中)

如果您编写了这样的登录模块,但该模块不起作用,则需要对其进行调试。 从通常的方法开始,以了解我的login()方法是否按预期工作,但登录失败。 我添加了打印语句等,以发现从未调用过getRoleSets()方法。 但是,一切看起来还不错。 我进行了一些谷歌搜索,发现了这个不错的Wiki页面 。 可以告诉Web应用进行审核日志记录

<jboss-web><context-root>rest</context-root><security-domain>RHQRESTSecurityDomain</security-domain><disable-audit>false</disable-audit>

仅此标志是不够的,因为您还需要设置适当的记录器,这在Wiki页上进行了说明。 启用此功能后,我看到了类似

16:33:33,918 TRACE [org.jboss.security.audit] (http-/0.0.0.0:7080-1) [Failure]Source=org.jboss.as.web.security.JBossWebRealm;
principal=null;request=[/rest:….

因此很明显,登录模块未设置主体。 然后查看超类中的代码,将我带到上面提到的loginOk标志。

现在,一切都正确设置了,自动日志看起来像

22:48:16,889 TRACE [org.jboss.security.audit] (http-/0.0.0.0:7080-1) [Success]Source=org.jboss.as.web.security.JBossWebRealm;Step=hasRole; principal=GenericPrincipal[rhqadmin(rest-user,)]; request=[/rest:cookies=null:headers=authorization=user-agent=curl/7.29.0,host=localhost:7080,accept=*/*,][parameters=][attributes=];

因此,在这里您看到主体rhqadmin已登录并获得了剩余用户分配的角色,这是web.xml中security-constraint元素中的一个匹配对象。

进一步查看

我已将以上内容作为环聊直播进行了介绍 。 不幸的是,当我在解释时打字时,G +会不时使我静音。

视频播放完后,我还有其他问题,最终让我重新思考启动阶段,以防用户安装了启用了LDAP的RHQ先前版本。 在这种情况下,安装程序仍将安装初始的仅基于DB的RHQUserSecurityDomain,然后在启动bean中,检查a)系统设置中是否启用了LDAP,以及b)登录模块是否实际存在。 如果a)匹配并且不存在,我们将安装它们。

此Bugzilla条目还包含有关整个故事的更多信息。

参考:从JCG合作伙伴 Heiko Rupp在“ 一些事情要记住”博客中创建一个委派的登录模块(用于JBoss EAP 6.1) 。

翻译自: https://www.javacodegeeks.com/2013/05/creating-a-delegating-login-module-for-jboss-eap-6-1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】开源:FLTK图形界面库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍FLTK图形界面库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0…

蜗牛学院:中国人,努力获得了荣誉却要压抑克制

上周&#xff0c;在取得双11三连冠的佳绩之后&#xff0c;百雀羚顺势推出了一支视频广告《你应该骄傲》。 广告内容感动了无数人&#xff0c;并在广告圈和自媒体引发了持续刷屏。&#xff08;视频见文末&#xff09; 从《一九三一》到《韩梅梅快跑》&#xff0c;百雀羚今年多次…

学计算机专业独立显卡有必要吗,不玩游戏独立显卡有什么作用_如果不玩游戏需要选择独立显卡吗-系统城...

现在有些笔记本刚买来的时候会有自带的独立显卡和集成显卡&#xff0c;有些朋友在买了笔记本后并不想玩游戏&#xff0c;这时候他们就有了一个疑问不玩游戏独立显卡有什么作用呢&#xff1f;如果不玩游戏需要选择独立显卡吗&#xff1f;小编在这里就给大家带来电脑独立显卡的作…

Spring JMS,消息自动转换,JMS模板

在我的一个项目中&#xff0c;我应该创建一个消息路由器&#xff0c;就像所有路由器都应该从一个主题中提取JMS消息并将其放入另一个主题中一样。 该消息本身是JMS文本消息&#xff0c;实际上包含XML消息。 收到消息后&#xff0c;我还应该添加一些其他数据来丰富消息。 我们不…

前端人英语学习的那点事儿

小时候英语学得不好&#xff0c;这个不能怪老师。后来自己想&#xff1a;反正以后我也不出国&#xff0c;加之学习方法不对&#xff0c;英语水平比较差劲、工作之后才发现&#xff0c;英语真是重要、第一手资料几乎都是英文的&#xff0c;很多前端书籍翻译得都挺那啥的&#xf…

大学物理质点动力学思维导图_生理学 | 思维导图

1.声明&#xff1a;第一部分的思维导图来源于网络&#xff0c;但是早就被传疯了。还是一句话&#xff0c;侵删。2.后面明显高清的思维导图是我自己画的,有版权.已经在公众号(id : 医学猿MIT)上传。下面来源&#xff1a;网络▲物质的跨膜转运▲肌细胞的收缩▲血液▲一级消除动力…

WB8使用说明-基础(引用)

1、静态引用链接&#xff1a; 通过设置如下属性来来静态引用CSS和JScssLinks : Array需要在页面中引用的css链接列表。该属性仅在首页或在iframe中运行的模块内有效&#xff0c;内置模块页面引用css请使用Wb.addLink方法。 jsLinks : Array需要在页面中引用的js链接列表。该属性…

jQuary总结11:jQuery插件封装---jQuery封装 手风琴 动画插件

完整代码下载点击我的GitHub: https://github.com/XingJYGo/jquery-accordion 1 手风琴的效果展示如下: 2 封装插件目录结构如下: 主要包括:HTML结构, CCS样式,JS文件以及jquary库. 3 插件封装步骤如下: 3-1首先,编写HTML静态结构: <div id"box"><ul><…

Spring MVC:表单处理卷。 2 –复选框处理

很难想象现代Web应用程序中没有表单复选框的情况。 在之前的一篇文章中&#xff0c;我写了有关Spring MVC中的表单处理的文章 &#xff0c;作为本系列文章的续篇&#xff0c;我将写有关Spring MVC表单的文章&#xff0c;尤其是关于复选框处理的文章 。 这篇文章将介绍标签的标准…

给你的博客换个装-园子换装指南

博客园有很多漂亮的皮肤&#xff0c;但总是有一些地方我不大喜欢&#xff0c;所以经过慎重考虑&#xff0c;我决定亲自动手换个装。本文将介绍博客园换装的一些基础&#xff08;不涉及标准皮肤的做法&#xff09;&#xff0c;如果你想让你的博客更炫&#xff0c;可以参考本文入…

表格过滤器_气缸选型其实并不复杂,知道这些再也不怕选错气缸(附计算表格)...

文/第e机械气动系统概述在介绍气缸之前我们先了解一下气动系统。气动控制技术在国民经济各个领域&#xff0c;最近这些年, 它与传感器技术、电子信息技术密切融合&#xff0c;发展成为包括控制、传动和检测等在内的自动化技术, 现在已发展成为自动化领域的重要组成部分。气动控…

java中equals()和==的区别

java中的数据类型 基础数据类型 基础数据类型有byte、short、char、int、long、float、double、bool、String。除了 String 会比较地址,其它的基础类型的比较,使用 和 equals() 两者都是比较值。 String类的equals()方法源码 1 public boolean equals(Object anObject) {2 …

乒乓球比赛赛程_10月5日至10月11日中央电视台直播录播乒乓球比赛安排

10月5日至10月11日这一周中央电视台居然没有播乒乓球比赛?全国乒乓球锦标赛从5日开始进行各单项比赛&#xff0c;7日进行混双决赛&#xff0c;9日进行男双决赛和女单决赛&#xff0c;10日进行女双决赛和男单决赛。场场都是精彩好看的比赛&#xff0c;中央电视台体育频道一场都…

集合实例(集合覆盖)

集合覆盖是一种优化求解问题&#xff0c;对很多组合数学和资源选择问题给出了很好的抽象模型。 问题如下&#xff1a;给定一个集合S&#xff0c;集合P由集合S的子集A1到An组成&#xff0c;集合C由集合P中的一个或多个子集组成。如果S中的每个成员都包含在C的至少一个子集中则称…

关闭运动轨迹_网球初学者如何正确入门网球运动,有哪些学习细节

网球是一个非常有趣的球类运动。 当您开始入门时&#xff0c;您会越来越喜欢它。 那么网球初学者应该如何正确入门呢&#xff1f; 有什么独特的入门经验&#xff1f;即使没有网球经验&#xff0c;只要您能正确正确地进行定期训练&#xff0c;仍然可以取得很大的进步。首先&…

phpstorm+wamp+xdebug配置php调试环境

本篇文章主要是&#xff1a;教大家如果搭建一套phpstormwampxdebug调试php的环境现在大多数的程序员使用的调试方式一般都是echo, var_dump, file_put_contents等其他方式&#xff0c;效率比较低下&#xff0c;因此我们有必要学习用工具调试&#xff0c;工具调试主要可以用来解…

计算机专用英语1500词带音标,带音标的计算机英语1500词

带音标的计算机英语1500词 (46页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;29.9 积分&#xfeff;计算机专用英语词汇1500词《电脑专业英语》1. file [fail] n. 文件&#xff1b;v. 保存文件 2. …

需求改进与系统设计

第一部分 需求与原型改进 1.1改进的原型 1.1.1 改进说明 相较上一次的原型&#xff0c;这一次我们确定了主题颜色&#xff0c;并且使功能一眼就能看懂&#xff0c;让新用户能很快上手。 并且进一步完善了前期的调查问卷分析。得出结论同学们不去食堂吃饭的大部分原因是排队…

了解ADF Faces clientComponent属性

我相信大多数ADF开发人员都知道ADF Faces属性clientComponent 。 在这篇文章中&#xff0c;我将展示此属性实际上如何影响组件渲染以及它如何改变其行为。 让我们开始考虑一个非常简单的示例&#xff1a; <af:inputText label"Label 1" id"it1" /> …

谈谈一些有趣的CSS题目(十五)-- 谈谈 CSS 关键字 initial、inherit 和 unset

开本系列&#xff0c;谈谈一些有趣的 CSS 题目&#xff0c;题目类型天马行空&#xff0c;想到什么说什么&#xff0c;不仅为了拓宽一下解决问题的思路&#xff0c;更涉及一些容易忽视的 CSS 细节。解题不考虑兼容性&#xff0c;题目天马行空&#xff0c;想到什么说什么&#x…