设为首页 收藏本站
查看: 780|回复: 0

[经验分享] Weblogic中通过IdentityAsserter实现SSO

[复制链接]

尚未签到

发表于 2017-2-16 11:28:20 | 显示全部楼层 |阅读模式
weblogic8实现SSO的一种简单方案,就是通过IdentityAsserter解决。
步骤一、SSO目标配置

<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.do</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.htm</url-pattern>     
<url-pattern>*.doc</url-pattern>
<url-pattern>*.xls</url-pattern>
<url-pattern>*.xlsx</url-pattern>
<url-pattern>*.zip</url-pattern>
<url-pattern>*.rar</url-pattern>
<url-pattern>*.jpg</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>secrole</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>myrealm</realm-name>
</login-config>
<security-role>
<role-name>secrole</role-name>
</security-role>


步骤二、创建Identity Assertion Provider
1、产生MDF:ImepIdentityAsserter.xml

<?xml version="1.0" ?>
<!DOCTYPE MBeanType SYSTEM "commo.dtd">
<MBeanType
Name = "ImepIdentityAsserter"
DisplayName = "ImepIdentityAsserter"
Package = "com.huawei.netforce.security.sso"
Extends = "weblogic.management.security.authentication.IdentityAsserter"
PersistPolicy = "OnUpdate"
>
<MBeanAttribute
Name = "ProviderClassName"
Type = "java.lang.String"
Writeable = "false"
Default = "&quot;com.huawei.netforce.security.sso.ImepIdentityAsserterProviderImpl&quot;"
/>
<MBeanAttribute
Name = "Description"
Type = "java.lang.String"
Writeable = "false"
Default = "&quot;ImepIdentityAsserter Identity Assertion Provider&quot;"
/>
<MBeanAttribute
Name = "Version"
Type = "java.lang.String"
Writeable = "false"
Default = "&quot;1.0&quot;"
/>
<MBeanAttribute
Name = "SupportedTypes"
Type = "java.lang.String[]"
Writeable = "false"
Default = "new String[] {&quot;ImepToken&quot;}"
/>
<MBeanAttribute
Name = "ActiveTypes"
Type = "java.lang.String[]"
Default = "new String[] {&quot;ImepToken&quot;}"
/>
</MBeanType>

java -DcreateStubs="true" weblogic.management.commo.WebLogicMBeanMaker -MDF ImepIdentityAsserter.xml -files d:\src
2、创建提供程序实现

import java.io.PrintStream;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.login.AppConfigurationEntry;
import weblogic.management.security.ProviderMBean;
import weblogic.security.spi.*;
public class ImepIdentityAsserterProviderImpl
implements AuthenticationProvider, IdentityAsserter
{
private static final String TOKEN_TYPE = "ImepToken";
private static final String TOKEN_PREFIX = "username=";
private String description;
public ImepIdentityAsserterProviderImpl()
{
}
public AppConfigurationEntry getAssertionModuleConfiguration()
{
return null;
}
public IdentityAsserter getIdentityAsserter()
{
return this;
}
public AppConfigurationEntry getLoginModuleConfiguration()
{
return null;
}
public PrincipalValidator getPrincipalValidator()
{
return null;
}
public String getDescription()
{
return description;
}
public void initialize(ProviderMBean mbean, SecurityServices services)
{
System.out.println("ImepIdentityAsserterProviderImpl.initialize");
ImepIdentityAsserterMBean myMBean = (ImepIdentityAsserterMBean)mbean;
description = myMBean.getDescription() + "\n" + myMBean.getVersion();
}
public void shutdown()
{
}
public CallbackHandler assertIdentity(String type, Object token)
throws IdentityAssertionException
{
if(!"ImepToken".equals(type))
{
String error = "ImepIdentityAsserterProviderImpl received unknown token type \"" + type + "\"." + " Expected " + "ImepToken";
throw new IdentityAssertionException(error);
}
if(!(token instanceof byte[]))
{
String error = "ImepIdentityAsserterProviderImpl received unknown token class \"" + token.getClass() + "\"." + " Expected a byte[].";
throw new IdentityAssertionException(error);
}
byte tokenBytes[] = (byte[])token;
if(tokenBytes == null || tokenBytes.length < 1)
{
String error = "ImepIdentityAsserterProviderImpl received empty token byte array";
throw new IdentityAssertionException(error);
}
String tokenStr = new String(tokenBytes);
if(!tokenStr.startsWith("username="))
{
String error = "ImepIdentityAsserterProviderImpl received unknown token string \"" + type + "\"." + " Expected " + "username=" + "username";
throw new IdentityAssertionException(error);
} else
{
String userName = tokenStr.substring("username=".length());
return new ImepCallbackHandlerImpl(userName);
}
}
}


import java.io.IOException;
import javax.security.auth.callback.*;
public class ImepCallbackHandlerImpl
implements CallbackHandler
{
private String userName;
public ImepCallbackHandlerImpl(String aUserName)
{
userName = aUserName;
}
public void handle(Callback callbacks[])
throws IOException, UnsupportedCallbackException
{
for(int i = 0; i < callbacks.length; i++)
{
Callback callback = callbacks;
if(!(callback instanceof NameCallback))
throw new UnsupportedCallbackException(callback, "Unrecognized Callback");
NameCallback nameCallback = (NameCallback)callback;
nameCallback.setName(userName);
}
}
}


3、MJF打包
java weblogic.management.commo.WebLogicMBeanMaker -MJF ImepIdentityProvider.jar -files d:\src
4、服务端配置
把这个提供程序(ImepIdentityProvider.jar)复制到WL_HOME/server/lib/mbeantypes目录下,然后重新启动服务器。启动管理控制台,并导航到Security/myrealm Providers/Authentication节点。在可用验证器和身份确认器的列表中,应该可以找到“Configure a new ImepIdentityAsserter...”选项。选择这个选项并点击Create,就可以配置身份确认器了。在接下来的选项卡中,您将会注意到,支持的令牌类型被设置为ImepToken和对于ImepToken是活动的令牌。现在,必须重新启动服务器,从而使修改生效。
步骤三、测试
1、URLConnection测试

try
{
//test账户需要在myrealm中进行配置
String token = "username=test";
//是否需要编码可在控制台配置时取消,默认为BASE64编码
BASE64Encoder encoder = new BASE64Encoder();
String encodedToken = encoder.encodeBuffer(token.getBytes());
URL url = new URL("http://localhost:7001/app/index.jsp");
URLConnection connection = url.openConnection();
connection.setRequestProperty("ImepToken",encodedToken);
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line = "";
while((line = in.readLine()) != null)
{
System.out.println(line);
}
}
catch(Exception e)
{
e.printStackTrace();
}


2、SSO源测试
由于IdentityAsserter需要客户端提供令牌,故在请求SSO目标应用时,需要在cookie中增加ImepToken属性
SSO目标在接收token并redirect的servlet代码片段为:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String tokenValue = request.getParameter("token");
String redirect = request.getParameter("redirect");
if(StringUtils.isNotEmpty(tokenValue))
{
//IdentityAsserterProvider从cookie或者header中取token
Cookie cookie = new Cookie("ImepToken", tokenValue);
response.addCookie(cookie);
response.setHeader("ImepToken",tokenValue);
//添加P3P策略主要解决iframe集成时浏览器阻止跨域cookie
response.setHeader("P3P","CP=CAO PSA OUR");
response.sendRedirect(redirect);
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-342976-1-1.html 上篇帖子: 为WTC配置WEBLOGIC服务访问点 下篇帖子: weblogic集群环境部署多应用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表