使用JAAS框架和LDAP做验证(Authentication)、授权(Authorization)

转载 2006年05月25日 13:16:00

前言:
网上很多文章都在讲LDAP Server,但是很少有人提及如何使用它来做验证和授权,今天写出此贴,希望能够帮助各位开发人员。

目标:
使用JAAS框架,使用Struts框架,使用LDAP Server,使用JBOSS,做用户的验证和授权
(验证的含义是用户有效,即用户名、密码输入正确;授权的含义是用户被授予某种角色)

基础要求:
精通J2EE框架
会使用Struts开发
能够正确安装iPlanet Directory Server,并有使用经验
熟悉JBOSS开发
熟悉JAAS框架

准备:
windows 2k (要加入域)
j2sdk1.4.2 installed
jboss3.2.5 higher installed
iPlanet Directory Server 5.1 Service Pack 2 installed

首先说一下JAAS和LDAP:
在实际开发过程中,很多项目都会使用同一个用户信息源,比如客户的Notes系统、ERP系统等等。
如果我们授命为客户开发一套新的应用,就需要和上述系统一同使用一个用户信息源“LDAP Server”。
JAAS是一个JAVA应用的验证、授权框架。很多Application Server都会去实现这个框架(JBOSS就是其中之一),从而使开发人员不需要自己动手就可以在项目中使用高可靠的安全验证体系。

首先假设我们在JBOSS下开发一个应用,叫做“myapp”
LDAP Server使用Sun iPlanet Directory Server
LDAP中增加一个组织结构
Group: admin, Engineer
Role:  SysUser, admin, Engineer
User:  JZhao (密码:password,角色:SysUser、admin、Engineer)

如果不愿意手动建立用户,可以copy下面的内容存入temp.ldif文件中,使用iPlanet的导入功能建立用户
temp.ldif文件的内容:
# ================================== OU DEFINITIONS
# People OU - for holding records of all individuals
dn: ou=People,dc=china,dc=xxx,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit

# Groups OU - for holding records of groupings of individuals
dn: ou=Groups,dc=china,dc=xxx,dc=com
ou: Groups
objectClass: top
objectClass: organizationalUnit

# Roles OU - for holding records of roles and the groups to which those roles have been assigned
dn: ou=Roles,dc=china,dc=xxx,dc=com
ou: Roles
objectClass: top
objectClass: organizationalUnit


# ================================== PEOPLE ENTRIES
dn: uid=JZhao,ou=People,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetorgperson
sn: Zhao
cn: Jun Zhao
uid: JZhao
userPassword: {SSHA}UvEbEwmjbUYCjugQ8p53EPj0z22bbAxiWmSCaA==
mail: junzhao@vandagroup.com.cn

# ================================== GROUPS ENTRIES
dn: cn=SysUser,ou=Groups,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: SysUser
uniqueMember: uid=JZhao,ou=People,dc=china,dc=xxx,dc=com

dn: cn=admin,ou=Groups,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: admin
uniqueMember: uid=JZhao,ou=People,dc=china,dc=xxx,dc=com

dn: cn=Engineer,ou=Groups,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: Engineer


# ================================== ROLES ENTRIES
dn: cn=SysUser,ou=Roles,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: SysUser
uniqueMember: cn=Everyone,ou=Groups,dc=china,dc=xxx,dc=com
uniqueMember: uid=JZhao,ou=People,dc=china,dc=xxx,dc=com

# =======================
dn: cn=admin,ou=Roles,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: admin
uniqueMember: cn=admin,ou=Groups,dc=china,dc=xxx,dc=com
uniqueMember: uid=JZhao,ou=People,dc=china,dc=xxx,dc=com

# =======================
dn: cn=Engineer,ou=Roles,dc=china,dc=xxx,dc=com
objectClass: top
objectClass: groupOfUniqueNames
cn: Engineer
uniqueMember: cn=Engineer,ou=Groups,dc=china,dc=xxx,dc=com
uniqueMember: uid=JZhao,ou=People,dc=china,dc=xxx,dc=com


WEB-INF/web.xml中增加下面内容:

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
   
    <!-- 添加入口角色检查,本段内容规定SysUser可以进入系统 -->
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Restricted</web-resource-name>
            <description>Declarative security tests</description>
            <url-pattern>*.do</url-pattern>
            <url-pattern>/servlet/ComandLineServlet</url-pattern>
            <http-method>HEAD</http-method>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>PUT</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>SysUser</role-name>
        </auth-constraint>
        <user-data-constraint>
            <description>no description</description>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

    <!-- 定义登录的页面和登录出错的页面 -->
    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/login.jsp</form-error-page>
        </form-login-config>
    </login-config>

    <!-- 在此定义安全角色 -->
    <security-role>
        <description>A user allowed to login</description>
        <role-name>SysUser</role-name>
    </security-role>

 

WEB-INF/jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.3//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_3_2.dtd">

<jboss-web>
 <security-domain>java:/jaas/myapp-security</security-domain>
     <context-root>myapp</context-root>
</jboss-web>


JBOSS_HOME/server/default/conf/login-config.xml中增加

    <application-policy name = "myapp-security">
       <authentication>
          <login-module code = "org.jboss.security.auth.spi.LdapLoginModule" flag = "required">
  <module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
  <module-option name="java.naming.provider.url">ldap://home.china.xxx.com:389/</module-option>
  <module-option  name="java.naming.security.authentication">simple</module-option>
  <module-option  name="principalDNPrefix">uid=</module-option>
  <module-option  name="principalDNSuffix">,ou=People,dc=china,dc=xxx,dc=com</module-option>
  <module-option  name="rolesCtxDN">ou=Roles,dc=china,dc=xxx,dc=com</module-option>
  <module-option  name="uidAttributeID">uniqueMember</module-option>
  <module-option  name="roleAttributeID">cn</module-option>
  <module-option  name="matchOnUserDN">true</module-option>
          </login-module>
       </authentication>
    </application-policy>

index.jsp内容:
<%
out.write("Login Successful!  "+new java.util.Date());
out.write("is SysUser="+httpServletRequest.isUserInRole("SysUser"));
out.write("is admin="+httpServletRequest.isUserInRole("admin"));
out.write("is Engineer="+httpServletRequest.isUserInRole("Engineer"));
%>

login.jsp中的FORM内容:
    
<FORM name="logonForm"  method="post" action="j_security_check">
 <input name="j_username" type="text" />
 <input name="j_password" type="password" />
</FORM>

*     帐号  j_username
*     密码  j_password
*     action  j_security_check
“*”内容为固定写法,不能改变


所有准备完成之后,启动JBOSS,在浏览器中输入http://ip:8080/myapp 进入index.jsp,但权限不允许匿名进入,所以会被Server将请求转入login.jsp,输入JZhao:password,判断成功之后,将会自动转入index.jsp,在页面中你会看到下面的输入

Login Successfull!  Sat Nov 27 11:52:36 CST 2004
is SysUser=true
is admin=true
is Engineer=true

Yii - 验证和授权(Authentication and Authorization)

1. 定义身份类 (Defining Identity Class)  为了验证一个用户,我们定义一个有验证逻辑的身份类。这个身份类实现[IUserIdentity] 接口。 不同的类可能实现...

shiro使用redis缓存session会话、authentication信息、authorization信息简述

* 目录 *介绍 配置 maven依赖 spring配置 重新实现shiro CacheManager shiro缓存配置 其他说明 测试 总结 介绍  当我们使用了nginx做负载均衡,使用了多个w...

Chapter 2 User Authentication, Authorization, and Security(1):选择Windows和SQL 身份验证

SQL Server 有两种身份验证:一种是WIndows身份验证,Windows身份验证使用Windows上的帐号,并利用其安全令牌进行验证。一种是SQL Server验证,使用SQL Server...

Chapter 2 User Authentication, Authorization, and Security(7):创建和使用用户自定义服务器角色

从SQL Server 2012开始,不再限制于使用固定服务器角色,可以创建自定义的角色,允许你预设特殊权限。...

JAAS Authentication Tutorial

JAAS Authentication TutorialThe JavaTM Authentication and Authorization Service (JAAS) was introduce...

Jaas Authentication文档翻译

JAAS Authorization Java认证和授权服务是Java 2中的一个可选包。 JAAS被用来实现两个目的: 1.      用户认证,为了可靠和安全的确认当前谁在运行Java代码,...

Chapter 2 User Authentication, Authorization, and Security(3):保护服务器避免暴力攻击

暴力攻击(Brute-force attack)是通过几乎所有可能的字符组合尝试破解密码,或者使用一个字典表,包含几乎所有可能的密码来实现密码破解的方法。如果你的密码很简单,那么很快就会被破解。所以,...

Chapter 2 User Authentication, Authorization, and Security(2):创建登录帐号

登录帐号是定义在服务器(实例)级别,并能被授予进行管理任务、连接、访问数据库等权限的帐号。SQL Server安全模型有两个级别:服务器级别和数据库级别。登录帐号必须先创建在服务器级别。如果需要访问数...

Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据

在SQL Server 2005之前,所有服务器和数据库元数据都是所有人可见的。当基于网银的系统把SQL Server实例共享给客户时,有可能可以看到其他用户的信息。从2005开始,可以通过控制权限来...

Tomcat JAAS 身份验证和授权

ava 认证和授权服务(JAAS)是一种用于验证用户身份以确定安全等级的 Tomcat Realm ( org.apache.catalina.Realm)的实现。 需求 Tomcat 7.0...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用JAAS框架和LDAP做验证(Authentication)、授权(Authorization)
举报原因:
原因补充:

(最多只允许输入30个字)