Weblogic 用戶自助解鎖的2種方式試驗

有一個修改密碼的需求岳悟,要求修改完密碼之后判斷當前用戶是否被鎖佃迄,被鎖了的話自動解鎖該用戶。

weblogic控制臺本身有取消用戶鎖定的功能贵少,但是只能一個一個去解鎖呵俏,如下圖所示:

嘗試了2種方式去解鎖。第一種是執(zhí)行java命令滔灶,在集群狀態(tài)下沒成功普碎;另一種是用JMX獲取MBean來解鎖。



一. 使用java命令

這里會用到3條命令:

(1)查找所有Security開頭的MBean資源:

java -cp E:\oracle\Middleware\wlserver_12.1\server\lib\weblogic.jar weblogic.Admin -url 192.168.1.199:7001 -username weblogic -password 11111111 query -pretty -pattern Security:*

打開CMD命令行录平,執(zhí)行該命令后麻车,會顯示MBean Name的列表缀皱,如下圖所示:

紅框圈住的MBeanName就是我要用來解鎖的Name,怎么確定是這個MBean呢动猬?

首先啤斗,oracleRealm是這臺weblogic的默認安全域名,UserLockoutManager是固定名稱赁咙,oracleRealm+UserLockoutManager自然就是我要找的MBean钮莲。

其次,該MBean下列出了一些用戶封鎖管理統(tǒng)計信息彼水,這些屬性值和weblogic控制臺的用戶封鎖管理統(tǒng)計信息是一致的崔拥,如下圖所示:

(2)查詢某個用戶是否被鎖了:

java -cp E:\oracle\Middleware\wlserver_12.1\server\lib\weblogic.jar weblogic.Admin -url 192.168.1.199:7001 -username weblogic -password 11111111 invoke -mbean Security:Name=oracleRealmUserLockoutManager -method isLockedOut poweruniontest

命令執(zhí)行后,如果該用戶被鎖了返回true凤覆,否則返回false(我這里是沒被鎖定的截圖)链瓦,返回結果如下圖所示:

(3)解鎖:

java -cp E:\oracle\Middleware\wlserver_12.1\server\lib\weblogic.jar weblogic.Admin -url 192.168.1.199:7001 -username weblogic -password 11111111 invoke -mbean Security:Name=oracleRealmUserLockoutManager -method clearLockout poweruniontest

命令執(zhí)行后,不管該用戶是否被鎖叛赚,都會返回OK,如果命令執(zhí)行發(fā)生錯誤則會返回failed(未驗證)稽揭,如下圖所示:


試驗結論:試驗證明俺附,在只有一個服務器實例的情況下,這種方法是可以成功解鎖的溪掀;但是事镣,在集群環(huán)境下,比如有一個管理服務器實例(7003)和一個受管服務器實例(8086)揪胃,不能解鎖璃哟,其失敗表現(xiàn)有三:

1.MBean Name的用戶封鎖管理統(tǒng)計信息和weblogic控制臺的信息不符,一些鎖定信息始終為0喊递,如下圖所示:



2.?查詢用戶是否被鎖随闪,結果始終返回false。

3.解鎖骚勘,結果始終返回ok铐伴。

原因不明,如有發(fā)現(xiàn)俏讹,歡迎指正当宴。




二. 使用JMX獲取MBean來解鎖

1.下面是解鎖的封裝類:


import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

import com.powerunion.oapm.config.ConfigUtil;


public class UnlockWeblogicUser {
?
?public MBeanServerConnection connection;
?public JMXConnector connector;
?public static final ObjectName service;
?public static final String adminServerName;
?
?static{
??try {

???//Type前面沒有空格,若留了空格會報錯:?

? ?//javax.management.InstanceNotFoundException:?

? //com.bea:Name=DomainRuntimeService, T

? //ype=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean


???service = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
???adminServerName = ConfigUtil.getInstance().getParameter("weblogic.security.server.name");
??} catch (MalformedObjectNameException? e) {
???System.out.println("error:"+e.getMessage());
???throw new AssertionError(e.getMessage());
??}
?}
?
?public boolean invoke(String method, String username) {
??????? String rez = "failed";
??????? int index = 0;
??????? try {
??????? ?System.out.println("About to invoke sericuty method....");
??????????? ObjectName[] serverRT =
??????????????????? (ObjectName[]) connection.getAttribute(service,
??????????????????? "ServerRuntimes");

????????????/*?

???????????? * adminServerName:?在配置文件中配置泽疆,集群中管理服務器

?????????????*的名稱户矢,即負責登錄解鎖等功能的服務器實例的名稱。

???????????? *這里對serverRT進行遍歷殉疼,將管理服務器的索引找出來梯浪。

???????????? */
??????????? for(int i = 0;i < serverRT.length;i++){
??????????? ?if(serverRT[i].toString().contains(adminServerName)){
??????????? ??index = i;
??????????? ??break;
??????????? ?}
??????????? }
??????????? ObjectName ssr =
??????????????????? (ObjectName) connection.getAttribute(serverRT[index],
??????????????????? "ServerSecurityRuntime");
??????????? ObjectName rrm =
??????????????????? (ObjectName) connection.getAttribute(ssr,
??????????????????? "DefaultRealmRuntime");
??????????? ObjectName ulr =
??????????????????? (ObjectName) connection.getAttribute(rrm,
??????????????????? "UserLockoutManagerRuntime");
??????????? if(method.equals("isLockedOut")) {
??????????????? rez =
??????????????????????? connection.invoke(ulr, method,
????????????????????????????????????????? new Object[] {username},
????????????????????????????????????????? new String[] {"java.lang.String"}).
??????????????????????? toString();
??????????? } else if(method.equals("clearLockout")) {
??????????????? connection.invoke(ulr, method,
????????????????????????????????? new Object[] {username},
????????????????????????????????? new String[] {"java.lang.String"});
??????????????? rez = "OK";
??????????? }
??????????? System.out.println("User=" + username + " " + method + "=" + rez);

??????? } catch (MalformedURLException exc) {
??????? ?exc.printStackTrace();
??????? } catch (IOException exc) {
??????? ?exc.printStackTrace();
??????? } catch (Exception e) {
??????? ?e.printStackTrace();
??????? }
??????? try {
??????????? connector.close();
??????? } catch (MalformedURLException exc) {
??????????? System.out.println(exc.getMessage());
??????? } catch (IOException exc) {
??????????? System.out.println(exc.getMessage());
??????? } catch (Exception e) {
??????????? System.out.println(e.getMessage());
??????? }
??????? if (rez.trim().equals("false") || rez.trim().equals("failed")) {
??????????? return false;
??????? } else {
??????????? return true;
??????? }
??? }
?
?public void initConnection(String hostname, String portString,String username, String password) throws IOException,MalformedURLException{
??String protocol = "t3";
??Integer portInteger = Integer.valueOf(portString);
??int port = portInteger.intValue();
??String jndiroot = "/jndi/";
??String mserver = "weblogic.management.mbeanservers.domainruntime";
??JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname, port, jndiroot + mserver);
??Hashtable<String, String> h = new Hashtable<String, String>();
??h.put(Context.SECURITY_PRINCIPAL, username);
??h.put(Context.SECURITY_CREDENTIALS, password);
??h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
??connector = JMXConnectorFactory.connect(serviceURL, h);
??connection = connector.getMBeanServerConnection();
??System.out.println("connected!");
?}
}

2.下面是調用的類:

//下面的ip捌年、port:管理服務器的ip和端口;username驱证、password:weblogic管理員的用戶名和密碼延窜。

String hostname = ConfigUtil.getInstance().getParameter("weblogic.hostname");
?????String port = ConfigUtil.getInstance().getParameter("weblogic.port");
?????String username = ConfigUtil.getInstance().getParameter("weblogic.admin.username");
?????String pass = ConfigUtil.getInstance().getParameter("weblogic.admin.password");
?????// weblogic判斷用戶sb是否被鎖,如果被鎖則解鎖
?????UnlockWeblogicUser uwu = new UnlockWeblogicUser();
?????uwu.initConnection(hostname, port, username, pass);
?????
?????if(uwu.invoke("isLockedOut",?“sb”)){
??????// 解鎖sb
??????uwu.initConnection(hostname, port, username, pass);
??????boolean ok = uwu.invoke("clearLockout",?“sb”);
??????if(!ok){
???????System.out.println("解鎖失斈ǔ:請查看日志信息逆瑞,檢查weblogic服務器或oapm程序。");
??????}
?????}

3.在集群和非集群的情況下伙单,該方法都可完美解鎖获高。


三.參考資料如下:

1.WebLogic11g-半小時讓你的domain集群化

2.Userlockout feature of Weblogic Server

3.在集群中serverRT[i]的下標不總是0,需要遍歷

4.Unlock a User Account(Java命令)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末吻育,一起剝皮案震驚了整個濱河市念秧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌布疼,老刑警劉巖摊趾,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異游两,居然都是意外死亡砾层,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門贱案,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛炮,“玉大人,你說我怎么就攤上這事宝踪∏仍悖” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵瘩燥,是天一觀的道長秕重。 經常有香客問我,道長厉膀,這世上最難降的妖魔是什么悲幅? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮站蝠,結果婚禮上汰具,老公的妹妹穿的比我還像新娘。我一直安慰自己菱魔,他們只是感情好留荔,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般聚蝶。 火紅的嫁衣襯著肌膚如雪杰妓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天碘勉,我揣著相機與錄音巷挥,去河邊找鬼。 笑死验靡,一個胖子當著我的面吹牛倍宾,可吹牛的內容都是我干的。 我是一名探鬼主播胜嗓,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼高职,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辞州?” 一聲冷哼從身側響起怔锌,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎变过,沒想到半個月后埃元,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡媚狰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年岛杀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哈雏。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡楞件,死狀恐怖衫生,靈堂內的尸體忽然破棺而出裳瘪,到底是詐尸還是另有隱情,我是刑警寧澤罪针,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布彭羹,位于F島的核電站,受9級特大地震影響泪酱,放射性物質發(fā)生泄漏派殷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一墓阀、第九天 我趴在偏房一處隱蔽的房頂上張望毡惜。 院中可真熱鬧,春花似錦斯撮、人聲如沸经伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽帕膜。三九已至枣氧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垮刹,已是汗流浹背达吞。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荒典,地道東北人酪劫。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像种蝶,于是被迫代替她去往敵國和親契耿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理螃征,服務發(fā)現(xiàn)搪桂,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應用盯滚。 當JAVA程序違反了JA...
    八爺君閱讀 4,587評論 1 114
  • 1. Java基礎部分 基礎部分的順序:基本語法踢械,類相關的語法,內部類的語法魄藕,繼承相關的語法内列,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,810評論 0 11
  • 繼承:NSObject 遵循:AFURLResponseSerialization 聲明處:AFURLRespon...
    _阿南_閱讀 1,142評論 0 1