Java Authentication Authorization Service(JAAS, Java认证和授权服务)
JAAS作用:解决Java EE应用的安全问题。
JAAS支持两种方式的安全性控制:声明式安全控制(declarative security),编程式安全控制(programmatic security)。
开发者可以使用XML部署表述文件或Annotation来声明安全控制,当声明式安全控制不足时,可采用编程式。
JAAS相关的概念
用户:通常由用户名,密码信息提供。
用户组:用户的集合。应用程序使用ACL(Access Control List)管理用户和用户组的权限。
安全域:为Web或应用程序提供的安全策略,其是包括用户、用户组的一个集合。应用服务器中最长见的安全域是:RDBMS安全域(各种信息都存储在数据库中,适合大型应用使用)、文件安全域(信息存储在文件中,适用于小型应用,用户小于1000)。
角色:一个角色一个抽象的名字,用于在应用中访问指定的资源的授权。
JAAS的工作流程
1:初始化请求
2:初始化认证
3:URL授权
4:完成原来的请求
5:调用EJB的方法
Web中的使用
声明式安全控制:
使用方法:
为整个应用声明安全性角色;
指定Web中受保护的资源,并指定授权访问被保护资源的角色;
指定登入方式。
可在web.xml中声明,
也可以用Java EE提供了javax.annotation.security包。
e.g.
web.xml
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<!-- 声明安全性角色 -->
<security-role>
<role-name>rolename</role-name>
</security-role>
<security-constraint>
<!-- 指定收保护的Web资源集 -->
<web-resource-collection>
<web-resource-name>resource</web-resource-name>
<url-pattern>/*</url-pattern>
<url-pattern>/context/*</url-pattern>
<!-- http-method子元素用于指定只保护指定请求方式的资源 -->
<!--
<http-method>GET || POST</http-method>
-->
</web-resource-collection>
<auth-constraint>
<!-- 访问受保护资源所需的角色 -->
<role-name>rolename</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<!-- 指定登录方式 BASIC:使用对话框来登录,FORM使用自定义的表单页登录 -->
<auth-method>BASIC</auth-method>
<realm-name>myRealm</realm-name>
<!--
<auth-method>FORM</auth-method>
<realm-name>myRealm</realm-name>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/login_fail.jsp</form-error-page>
</form-login-config>
-->
</login-config>
</web-app>
之后该为这些角色映射到服务器的用户组上.
并且配置和管理服务器上的用户和用户组,WebLogic可以在“安全领域”中配置,JBoss需在%JBOSS_HOME%/server/default/conf/login-config.xml文件中进行管理。
应用服务器特定的配置文件示例:
/WEB-INF/jboss-web.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE jboss-web PUBLIC
"-//JBoss//DTD Web Application 5.0//EN"
"http://www.jboss.org/j2ee/dtd/jboss-web_5_0.dtd">
<jboss-web>
<!-- 指定该Web应用使用哪个安全域(java:/jaas/是特定前缀) -->
<security-domain>java:/jaas/rolename</security-domain>
<context-root>basic</context-root>
</jboss-web>
/WEB-INF/weblogic.xml
<?xml version="1.0" encoding="GBK"?>
<weblogic-web-app>
<!-- 将安全角色映射到服务器上的用户组 -->
<security-role-assignment>
<role-name>rolename</role-name>
<principal-name>userGroup</principal-name>
</security-role-assignment>
</weblogic-web-app
编程式安全控制
Web应用的编程式安全控制是通过HttpServletRequest实现的,主要使用该接口的如下3个方法:
String getRemoteUser():返回这个请求的登录用户的用户名,若未登录,则返回null;
Principal getUserPrincipal():返回登录后的身份主体,该对象包含当前用户的用户名;
bealoon isUserInRole(String role):判断用户是否为指定角色。
EJB中使用EJBContext来实现,该接口提供如下2个方法:
Principal getUserPrincipal():返回登录后的身份主体,该对象包含当前用户的用户名;
bealoon isUserInRole(String role):判断用户是否为指定角色