创建委托登录模块(用于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;百雀羚今年多次…

html 访问节点,HTML DOM 访问节点

getElementById() 和 getElementsByTagName()getElementById() 和 getElementsByTagName() 这两种方法&#xff0c;可查找整个 HTML 文档中的任何 HTML 元素。这两种方法会忽略文档的结构。假如您希望查找文档中所有的元素&#xff0c;getElementsByTagName() 会把它们全部找到…

CSS3圆圈动画放大缩小循环动画效果

代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>CSS3圆圈动画放大缩小循环动画效果</title> <style>.dot { margin:150px a…

【BZOJ3589】动态树

题解&#xff1a;转载于:https://www.cnblogs.com/yinwuxiao/p/9103046.html

Lambda表达式在Java 8中的简单应用

我一直试图在我编写的代码中放入lambda表达式&#xff0c;而这个简单的例子就是相同的结果。 对于那些完全不了解Java中的Lambda表达式的人&#xff0c;我建议他们在进入本文之前先阅读此内容 。 好的&#xff0c;现在您已经熟悉了Lambda表达式&#xff08;在阅读了介绍性文章…

Poj2758 Checking the Text

题目传送门 经典的数据结构维护字符串哈希 这里用了很慢很慢的splay各种T&#xff08;也可能是死循环&#xff09; 不过没办法因为会写splay的能力还是要有的 #pragma GCC opitmize("O3") #pragma G opitmize("O3") #include<stdio.h> #include<s…

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

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

编程书籍集

【1】OS &#xff08;1&#xff09;《深入理解计算机系统》 &#xff08;2&#xff09;《程序员的自我修养&#xff1a;链接、装载与库》 &#xff08;3&#xff09;《程序员修炼之道》 &#xff08;4&#xff09;《计算机程序的构造和解释》 【2】C &#xff08;1&#xff09;…

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

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

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

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

课后作业-阅读任务-阅读提问-4

敏捷流程&#xff0c;感觉就像以前作业写不完还快开学了&#xff0c;然后一顿猛写:-)&#xff0c;那在实际编程中&#xff0c;是一开始就决定用敏捷流程&#xff1b;还是快到交付日期&#xff0c;大家加紧加班&#xff0c;赶工&#xff0c;自然而然就变成敏捷流程&#xff1f; …

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

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 …

判断字符串是否为正整数 浮点小数

/** * 判断字符串是否为数字(正整数和浮点数) * param str * return */public static boolean isNumeric(String str) { String reg "^[0-9](.[0-9])?$"; Pattern pattern Pattern.compile(reg); Matcher isNum pattern.matcher(str); if (!isNum.ma…