`
Dead_knight
  • 浏览: 1200889 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240185
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:48911
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:236861
社区版块
存档分类
最新评论

Weblogic中通过IdentityAsserter实现SSO

阅读更多
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[i];
            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);
        }
    }
2
1
分享到:
评论

相关推荐

    Weblogic使用YALE(耶鲁)CAS实现SSO单点登录 的方法.doc

    3. 实现 SSO:在 Weblogic 服务器中实现 SSO 单点登录,使用 CAS 服务器来验证用户的身份。 使用 YALE CAS 实现 SSO 单点登录可以提供一个安全、可靠的身份验证解决方案,适合大多数的企业应用场景。

    WebLogic平台的Web SSO(SAML)解决方案

    在WebLogic Server中实现SSO,关键在于利用SAML作为通信协议,通过身份提供者(IDP)和服务提供者(SP)之间的协作来实现用户的透明登录。具体来说: 1. **身份验证流程**:当用户尝试访问某个SP时,SP会重定向用户...

    SSO的简单实现SSO的简单实现

    以下是对SSO简单实现的详细说明: 在实现SSO时,有多种方法可以选择: 1. **商业软件**:一些大型公司如 Netgrity(Siteminder)、Novell(iChain)、RSA(ClearTrust)等提供专门的SSO解决方案。这些软件通常具备...

    java单点登录的实现与应用整合中SSO的技术实现

    Java单点登录(Single Sign-On, SSO)的实现是一个复杂但重要的任务,尤其是在大型企业或组织中,它能够提供用户友好的访问体验,减少多次输入凭证的繁琐过程。SSO技术的应用通常涉及到多系统间的身份验证整合,使得...

    Apache实现weblogic集群配置

    Apache 实现 WebLogic 集群配置是一种常见的负载均衡策略,它通过Apache HTTP服务器作为反向代理,将来自客户端的请求分发到多个WebLogic服务器实例上,从而提高应用程序的可用性和性能。以下是对该配置过程的详细...

    JMS入门小例子以及weblogic安装,并且在weblogic中配置JMS服务

    JMS提供了一种标准接口,使得应用开发者可以使用不同的消息中间件(Message Broker),如WebLogic Server,而无需关心具体的实现细节。 WebLogic Server是一款由Oracle公司提供的企业级应用服务器,它支持JMS服务,...

    java实现自定义Weblogic监控

    java实现自定义Weblogic监控java实现自定义Weblogic监控java实现自定义Weblogic监控

    Weblogic中文教程

    1. 部署方式:包括手动部署、自动部署和热部署,可以通过控制台或者命令行工具(WLST,WebLogic Scripting Tool)进行。 2. 部署计划:定义何时、何地、如何部署应用程序,可以设置滚动更新策略,减少服务中断时间。...

    weblogic部署EJB2.0 实现本地接口的SessionBean

    在本文中,我们将深入探讨如何在WebLogic环境中部署EJB 2.0,特别是实现本地接口的Session Bean。 EJB 2.0是Java EE早期版本中的组件模型,用于构建可复用、分布式的企业级服务。它定义了三种主要类型的Bean:...

    weblogic websocket示例代码

    WebLogic Server作为Oracle提供的企业级Java应用服务器,支持WebSocket协议,为开发者提供了在Java EE环境中实现WebSocket应用的能力。本示例代码是针对在WebLogic上开发WebSocket应用的一个详细实例,旨在帮助...

    p6spy 在weblogic中的配置 以及使用sqlprofiler监控

    通过在WebLogic中配置P6Spy并使用SQLProfiler,我们可以获取详细的SQL执行信息,从而优化数据库性能。这个过程涉及到对WebLogic数据源的配置、P6Spy代理驱动的使用以及`spy.properties`的定制。理解这些知识点对于...

    将应用部署在weblogic中于axis2冲突的问题及解决方案

    在Weblogic Server 10.3.4中,这个问题可以通过在WEB-INF\lib目录下配置weblogic.xml文件来解决。该文件的配置内容如下: ```xml &lt;!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application ...

    在weblogic中部署的MVC例子

    在WebLogic中部署MVC(模型-视图-控制器)应用程序是一个常见的实践,尤其是在企业级Java应用开发中。WebLogic是Oracle公司提供的一个强大的Java EE(Enterprise Edition)应用服务器,它支持各种Java应用架构,包括...

    weblogic中文教程part3

    weblogic中文教程 讲解的很详细,感觉不错,共享出来 还有part2和part1,请搜索和下载

    bea Weblogic 中文帮助文档

    8. **API参考**:"javadocs"子文件可能包含WebLogic Server的API详细文档,这些文档可以帮助开发者了解如何使用提供的API接口来编程,实现特定功能。 9. **故障排除**:文档通常会包含故障排查和诊断技巧,帮助管理...

    Nginx实现tomcat与weblogic集群的负载均衡及故障处理

    总之,通过Nginx实现Tomcat和WebLogic集群的负载均衡,不仅可以提高系统的可用性和响应速度,还能有效应对高并发访问。结合合理的故障处理机制和性能调优策略,可以构建出稳定且高效的Web服务架构。

    weblogic 开机自动启动

    在这篇文章中,我们将详细介绍如何在 Windows 系统下实现 Weblogic 的开机自动启动。 Weblogic 安装目录 在开始配置自动启动之前,我们首先需要找到 Weblogic 的安装目录。默认情况下,Weblogic 的安装目录位于 `C...

Global site tag (gtag.js) - Google Analytics