Jboss+EJB3下使用JAVA验证和授权服务(JAAS)

JAVA JAAS 认证授权
本文介绍JAVA验证和授权服务(JAAS),包括基于属性和基于数据库(DB)的JAAS实现方式。涵盖JAAS的基本概念、配置方法、角色定义及权限测试等内容。
JAVA验证和授权服务(JAAS).JAAS具有两个特性:验证(Authentication)和授权(authorization),认证是完成用户名和密码的匹配校验;授权是决定用户可以访问哪些资源,授权是基于角色的.
一.基于属性的JAAS
1.定义用户和角色:
Jboss 默认的安全域”other”, “other”安全域告诉容器到classpath 中的users.propertes 和roles.properties找密码和用户角色列表。”other”安全域的定义在[jboss 安装目录]/server/default/conf/login-config.xml 文件。
这两个文件必须存放于类路径下。在进行用户验证时,Jboss 容器会自动寻找这两个文件。
“other”安全域默认情况下是不允许匿名用户(不提供用户名及密码)访问的,如果你想使匿名用户也可访问通过@PermitAll 注释定义的资源,这样就不用修改login-config.xml文件.
2.定义安全域

第一种方法:通过Jboss 发布文件(jboss.xml)进行定义
<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<security-domain>other</security-domain>
<unauthenticated-principal>AnonymousUser</unauthenticated-principal>
</jboss>

jboss.xml 必须打进Jar 文件的META-INF 目录。

第二种方法:通过@SecurityDomain 注释进行定义,注释代码片断如下
@Stateless
@Remote ({SecurityAccess.class})
@SecurityDomain("other") //通过注释定义为other,硬写在程序中,这样不便于维护,一般不提倡这样做.
public class SecurityAccessBean implements SecurityAccess{..........


3.为业务方法定义角色


@Stateless   
@Remote ({SecurityAccess.class})
public class SecurityAccessBean implements SecurityAccess{

@RolesAllowed({"AdminUser"})
public String AdminUserMethod() {
return "具有管理员角色的用户才可以访问AdminUserMethod()方法";
}

@RolesAllowed({"DepartmentUser"})
public String DepartmentUserMethod() {
return "具有事业部门角色的用户才可以访问DepartmentUserMethod()方法";
}

@PermitAll
public String AnonymousUserMethod() {
return "任何角色的用户都可以访问AnonymousUserMethod()方法, 注:用户必须存在users.properties文件哦";
}

}


@Stateless
@Remote ({SecurityAccess.class})
public class SecurityAccessBean implements SecurityAccess{

@RolesAllowed({"AdminUser"})
public String AdminUserMethod() {
return "具有管理员角色的用户才可以访问AdminUserMethod()方法";
}

@RolesAllowed({"DepartmentUser"})
public String DepartmentUserMethod() {
return "具有事业部门角色的用户才可以访问DepartmentUserMethod()方法";
}

@PermitAll
public String AnonymousUserMethod() {
return "任何角色的用户都可以访问AnonymousUserMethod()方法, 注:用户必须存在users.properties文件哦";
}

}


@RolesAllowed 注释定义允许访问方法的角色列表,如角色为多个,可以用逗号分隔。@PermitAll 注释定义所有的角色都可以访问此方法。

4.测试:
<%@ page contentType="text/html; charset=GBK"%>
<%@ page import="com.SecurityAccess,javax.naming.*,org.jboss.security.*,java.util.*"%>

<%Properties props = new Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
InitialContext ctx = new InitialContext(props);
String user = request.getParameter("user");
String pwd = request.getParameter("pwd");
if (user!=null && !"".equals(user.trim())){
SecurityAssociation.setPrincipal(new SimplePrincipal(user.trim()));
SecurityAssociation.setCredential(pwd.trim().toCharArray());
}
SecurityAccess securityaccess = (SecurityAccess)ctx.lookup("SecurityAccessBean/remote");
try{
out.println("<font color=green>调用结果:</font>"+securityaccess.AdminUserMethod()+ "<br>");
}catch(Exception e){
out.println(user+ "没有权限访问AdminUserMethod方法<BR>");
}

out.println("==========================<BR>");
try{
out.println("<font color=green>调用结果:</font>"+securityaccess.DepartmentUserMethod()+ "<br>");
}catch(Exception e){
out.println(user+ "没有权限访问DepartmentUserMethod方法<BR>");
}

out.println("==========================<BR>");
try{
out.println("<font color=green>调用结果:</font>"+securityaccess.AnonymousUserMethod()+ "<br>");
}catch(Exception e){
out.println(user+ "没有权限访问AnonymousUserMethod方法<BR>");
}

SecurityAssociation.clear();%>



<html>
<head><title>安全访问测试</title></head>
<body>
<center><h2>安全访问测试</h2></center><br />
请输入你的用户名及密码<br /><form method="POST" action="SecurityAccessTest.jsp">
Username: <input type="text" /><br />
Password: <input type="password" /><br />
<input type="submit" value="身份验证"/>
</form>

<p>管理员用户名: <STRONG>lihuoming</STRONG>  密码: <STRONG>123456</STRONG></p>
<p>事业部用户名: <STRONG>zhangfeng</STRONG>  密码<STRONG>111111</STRONG></p>
<p>合作伙伴用户名: <STRONG>wuxiao</STRONG>  密码<STRONG>123</STRONG></p></body></html>



二.基于DB的JAAS
1.定义安全域:

安全域在[jboss 安装目录]/server/default/conf/login-config.xml 文件中新增加一个定义,本例配置片断如下:

<application-policy >
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option >java:/MySqlDS</module-option>
<module-option > select password from sys_user where > </module-option>
<module-option > select A.rolename,'Roles' from sys_userrole as A, sys_user B where B.name=A.username and username=? </module-option>
<module-option >AnonymousUser</module-option>
</login-module>
</authentication>
</application-policy>



注意:principalsQuery 属性定义Jboss 通过给定的用户名如何获得密码;rolesQuery 属性定义Jboss通过给定的用户名如何获得角色列表,注意:SQL 中的'Roles'常量字段不能去掉,将在查询的记录中都加上Roles字符串.有些书上,这个sql语句是错误的

2.自定义安全域使用的sys_user 和sys_userrole 表:

CREATE TABLE `sys_user` (
`name` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;

CREATE TABLE `sys_userrole` (
`username` varchar(45) NOT NULL,
`rolename` varchar(45) NOT NULL,
PRIMARY KEY (`username`,`rolename`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;


3.修改jboss.xml ,改为所定义的新安全域


<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<security-domain>youname</security-domain>
<unauthenticated-principal>AnonymousUser</unauthenticated-principal>
</jboss>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值