`
seaboycs
  • 浏览: 127950 次
  • 性别: Icon_minigender_1
  • 来自: 南通
社区版块
存档分类
最新评论

EJB 3 Security Domain with Open LDAP

    博客分类:
  • JAVA
阅读更多

项目中用到了EJB 3 web service, 生产环境上都是有安全认证的,常见的认证有2中,一种是数据库认证,另外一种是LDAP认证。这篇文章主要讲述的是LDAP认证,使用的LDAP是openLDAP windows版本。

 

准备条件:

1. 服务器: JBoss 6 (自行下载)

2. LDAP:  Open LDAP for windows (参考网络,很多文档)

3. Maven 依赖:jboss-ejb3-ext-api, jboss-ejb-api, jboss-as-system-jmx

 

LDAP 配置

1. 依照网络上的通用例子新建一个xx.ldif文件,密码就设置成admin或者其他的,

dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: Example Company
dc: example

dn: cn=Manager,dc=example,dc=com
objectclass: organizationalRole
cn: Manager

 

2. 添加2个ou(Users, Roles):

dn: ou=Users,dc=example,dc=com
objectclass: organizationalRole
objectclass: top

dn: ou=Roles,dc=example,dc=com
objectclass: organizationalRole
objectclass: top

 

3. 添加1个测试用户和1个测试角色

dn: uid=tester,ou=Users,dc=example,dc=com
objectclass: top
objectclass: inetOrgPerson
objectclass: person
uid: tester
cn: tester
sn: tester
userPassword:1

dn: cn=test,ou=Users,dc=example,dc=com
objectClass: top
objectClass: groupOfNames
cn: test
description: testgroup
member: uid=tester,ou=Users,dc=example,dc=com

 注意:objectClass一定要匹配,不要弄错了。

 

再添加一个普通用户,不要加入到test组中,

 

dn: uid=tester2,ou=Users,dc=example,dc=com
objectclass: top
objectclass: inetOrgPerson
objectclass: person
uid: tester
cn: tester
sn: tester
userPassword:1

 

配置JBoss login config xml

1. 打开jboss-6\server\default\conf\login-config.xml, 在 <application-policy name="other">之前添加一段:

<application-policy name="sd">
		<authentication>
			<login-module code="org.jboss.security.auth.spi.LdapExtLoginModule"
				flag="required">
				<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
				<module-option name="java.naming.security.authentication">simple</module-option>
				<module-option name="java.naming.provider.url">ldap://example.com:389</module-option>
				<module-option name="bindDN">cn=Manager,dc=example,dc=com</module-option>
				<module-option name="bindCredential">admin</module-option>
				<module-option name="baseCtxDN">ou=Users,dc=example,dc=com</module-option>
				<module-option name="baseFilter">(uid={0})</module-option>
				<module-option name="rolesCtxDN">ou=roles,dc=example,dc=com</module-option>
				<module-option name="roleFilter">(member={1})</module-option>
				<module-option name="roleAttributeID">cn</module-option>
			</login-module>

		</authentication>
	</application-policy>

 

新建MAVEN项目

项目名:securityTest

 

pom.xml:

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.javaeye.ejb</groupId>
  <artifactId>securityTest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>ejb</packaging>
  <properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>	
		<dependency>
			<groupId>org.jboss.ejb3</groupId>
			<artifactId>jboss-ejb3-ext-api</artifactId>
			<version>1.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.javaee</groupId>
			<artifactId>jboss-ejb-api</artifactId>
			<version>3.0.0.CR1</version>
		</dependency>
		<dependency>
			<groupId>org.jboss.jbossas</groupId>
			<artifactId>jboss-as-system-jmx</artifactId>
			<version>6.0.0.M1</version>
		</dependency>
	</dependencies>

	<build>
		<finalName>securityTest</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
		<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
					<encoding>utf8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-ejb-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<ejbVersion>3.0</ejbVersion>
				</configuration>
			</plugin>			
		</plugins>
	</build>
</project>
 

 

Service Interface:

 

package com.javaeye.test;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(targetNamespace = "http://www.javaeye.com/test/", name = "test")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
public interface Test {

	public String process(String parameters);
}
 

 

Service Impl

 

package com.javaeye.ejb;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.jws.WebService;

import org.jboss.ejb3.annotation.SecurityDomain;
import org.jboss.wsf.spi.annotation.WebContext;

import com.javaeye.test.Test;

@Stateless
@WebService(serviceName = "Test", endpointInterface = "com.javaeye.test.Test", targetNamespace = "http://www.javaeye.com/test/")
@WebContext(contextRoot = "securityTest", urlPattern = "/test", authMethod = "BASIC", secureWSDLAccess = true)
@SecurityDomain("sd")
public class SecurityTestService implements Test{

	@RolesAllowed({ "test" })
	public String process(String parameters) {
		return "Hello, " + parameters;
	}

}
 

 

Service 很简单,就是一个hello + input。酷

执行 mvn clean install, 在target会生成一个jar包,把架包丢到jboss deploy目录下,启动jboss, 可以看到service注册成功:

 

15:31:41,069 INFO  [org.jboss.wsf.stack.cxf.metadata.MetadataBuilder] Add Service
 id=SecurityTestService
 address=http://localhost:9000/securityTest/test
 implementor=com.javaeye.ejb.SecurityTestService
 invoker=org.jboss.wsf.stack.cxf.InvokerEJB3
 serviceName={http://www.javaeye.com/test/}Test
 portName={http://www.javaeye.com/test/}SecurityTestServicePort
 wsdlLocation=null
 mtomEnabled=false
 

 

通过soup ui新建一个project, wsdl:http://localhost:9000/securityTest/test?wsdl

回车后要求输入用户和密码,则填入:tester/1,回车后打开项目,双击process方法下面的Request 1

 

Input:

 

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://www.javaeye.com/test/">
   <soapenv:Header/>
   <soapenv:Body>
      <test:process>aaa</test:process>
   </soapenv:Body>
</soapenv:Envelope>

 

 

 case 1: 在SOAP UI Reuest Property里面设置Username=tester, Password=1, (正确的用户,有正确的权限)然后执行方法,将返回

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <processResponse xmlns="http://www.javaeye.com/test/">Hello, aaa</processResponse>
   </soap:Body>
</soap:Envelope>
 

 

case 2: 在SOAP UI Reuest Property里面设置Username=tester, Password=12, (错误的用户密码)然后执行方法,将返回

 

<html><head><title>JBoss Web/3.0.0-CR1 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 401 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>This request requires HTTP authentication ().</u></p><HR size="1" noshade="noshade"><h3>JBoss Web/3.0.0-CR1</h3></body></html>
 

 

case 3: 在SOAP UI Reuest Property里面设置Username=tester2, Password=1, (正确的用户,没有权限)然后执行方法,将返回

 

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Caller unauthorized</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

 

至此,测试完毕。谢谢阅读!

分享到:
评论
1 楼 wengeldouble 2014-01-15  
细细阅读完,发现楼主写得太精致了,step by step, 享用了~~

相关推荐

    spring with ejb3

    标题 "spring with ejb3" 暗示了我们即将探讨的是如何在Spring框架中集成和使用EJB 3(Enterprise JavaBeans 3)技术。EJB 3是Java EE平台的一部分,它提供了用于构建企业级应用的服务和组件模型。Spring则是一个轻...

    实战角度比较EJB2和EJB3的架构异同

    【实战角度比较EJB2和EJB3的架构异同】 EJB,即Enterprise JavaBeans,是Java EE(企业版Java)平台的核心组件之一,用于构建可复用、分布式的服务器端应用程序。EJB2和EJB3是EJB技术的两个主要版本,它们在架构上...

    ejb3 带源码

    "ejb3 带源码"的资源,如"Mastering EJB3"和"Beginning EJB3 Application Development"等,提供了深入学习和实践EJB3技术的宝贵材料。 1. **EJB3核心概念**: - **实体Bean(Entity Bean)**:代表数据库中的持久...

    EJB3的三本好书第3本 Mastering EJB3 4ed

    EJB3的三本好书之三,也很不错的一本ejb3的书籍,是英文版,附带源代码,这本书的好处是与Mastering EJB 3ed有一定的继承性,可以对比来看. 3本书的地址 1. Beginning EJB3 Application Development From Novice to ...

    EJB3基础教程

    **EJB3基础教程** Enterprise JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务处理能力强的服务器端应用程序的重要技术。EJB3是EJB规范的一个重大改进版本,它极大地简化了开发过程,引入了许多现代编程...

    EJB3入门例子

    **EJB3(Enterprise JavaBeans 3.0)**是Java EE平台中的核心组件,它为企业级应用提供了服务器端的组件模型。EJB3引入了许多重大的改进,使其变得更加轻量级,降低了开发复杂性,使得开发者能够更专注于业务逻辑而...

    ejb3进阶案例

    **ejb3进阶案例详解** ejb3(Enterprise JavaBeans 3.0)是Java EE平台中的核心组件之一,它极大地简化了企业级应用程序的开发。ejb3引入了许多新特性和改进,使得开发人员可以更加高效地构建可扩展、可维护的企业...

    EJB3 PPT教程

    **EJB3(Enterprise JavaBeans 3)是Java EE(Enterprise Edition)平台中用于构建企业级应用程序的重要组件模型。这个PPT教程详细介绍了EJB3的各种核心概念和技术,旨在帮助学习者掌握EJB3的核心特性并能实际应用到...

    EJB3开发Entity

    本文将深入探讨EJB3中的Entity Bean,它是EJB3中的持久化组件,用于代表数据库中的实体。 1. **实体Bean的概念** 实体Bean是EJB3中的数据存储模型,它与数据库中的记录相对应。在EJB3中,实体Bean不再需要编写...

    EJB3应用实例

    **EJB3应用实例** EJB(Enterprise JavaBeans)3是Java EE(Enterprise Edition)平台中的核心组件之一,主要用于构建可扩展、可移植且高度模块化的企业级应用程序。EJB3引入了许多重大改进,简化了开发流程,降低...

    EJB3 入门经典 源码

    9. **安全控制(Security)**:EJB3允许开发者使用角色和权限来控制对bean方法的访问,提供了一种强大的安全机制。 在源码学习过程中,你可以通过以下步骤深入理解EJB3: 1. **阅读源码结构**:了解项目目录结构,...

    EJB 3实战 带书签

    EJB(Enterprise JavaBeans)3是Java平台企业版(Java EE)的一个核心组件,用于简化大型企业级应用的开发。自从EJB 3版本推出以来,它在简化实体管理、依赖注入和声明式服务等方面有了重大改进,使得开发者可以更加...

    EJB3的三本好书第2本, EJB3 in Action 2007

    EJB3的三本好书第二本,最好的介绍ejb3的书,看过之后,其他的书都送人了,而且附带的源代码,几乎包括了所有的主流应用服务器的例子,glassfish, jboss, weblogic, oracleAS 3本书分别是: 1. Beginning EJB3 ...

    ejb3-persistence

    【ejb3-persistence】是Java企业版(Enterprise JavaBeans,EJB)3.0规范中的持久化模块,它是Java后端开发中的一个重要组件,主要处理数据库操作和对象关系映射(Object-Relational Mapping,ORM)。在Spring框架中...

    ejb3-persistence.jar

    此外,EJB3的持久化机制也可以与Hibernate、OpenJPA等ORM工具配合使用,提供更高级的功能和性能优化。 总结,ejb3-persistence.jar是Java EE中实现EJB3持久化规范的关键组成部分,它极大地简化了Java应用与数据库...

    EJB3(入门经典简版)

    EJB3是EJB规范的一个重大改革版本,引入了许多简化开发的新特性,使得Java开发者能够更高效地构建分布式企业应用。 1. **EJB的概述** EJB是一种组件模型,它定义了如何在服务器端部署和管理业务逻辑。EJB3是基于...

    EJB3 实例练习(一)

    在这个实例练习中,我们将探讨EJB3的基本概念、特性以及如何创建和运行一个简单的EJB3应用。 1. EJB3概述 EJB3引入了注解驱动的编程模型,消除了XML配置文件的需求,大大减少了开发工作量。它包括三种主要类型的...

    ejb3_structs

    【 ejb3_structs 】是一个关于企业级JavaBean(EJB)3.0与Struts框架集成的项目。在Java EE(Enterprise Edition)应用程序开发中,EJB3和Struts是两个重要的组件,分别负责业务逻辑管理和用户界面展示。 **EJB...

    EJB3_Persistence开发手册-EJB3_QL查询

    ### EJB3_Persistence开发手册-EJB3_QL查询知识点详解 #### 一、EJB3与实体Bean操作概述 EJB(Enterprise JavaBeans)3规范中的持久化部分(即EJB3 Persistence)提供了一种简化的方式来管理和操作企业级应用程序...

    JSF+EJB3

    根据提供的文件信息,这里将详细解析与JSF(JavaServer Faces)+ EJB3(Enterprise JavaBeans 3)开发环境相关的知识点。 ### JSF + EJB3 开发环境搭建 #### 1. 软件准备 在搭建 JSF + EJB3 的开发环境中,需要...

Global site tag (gtag.js) - Google Analytics