`
successfulroof
  • 浏览: 74337 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Tomcat Realm的使用

    博客分类:
  • J2ee
 
阅读更多

 Realm  是什么,干嘛的。我这里就不说了

讲讲怎样配置Realm

<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
			driverName="oracle.jdbc.driver.OracleDriver"
			connectionURL="jdbc:oracle:thin:@192.168.9.172:1521:yfzx"
			connectionName="bi"
			connectionPassword="bi"
			userTable="users" userNameCol="user_name" userCredCol="passwd"
			userRoleTable="user_roles" roleNameCol="role_name"/>


  

 

className 请求提交到这个class

driverName 驱动名

 connectionURL 数据库URL

connectionName 账户

connectionPassword 数据库密码

userTable 用户表名

userNameCol 用户名涉及表的列

userCredCol 用户密码涉及表列

userRoleTable 角色表,这个一般和用户表相关联

roleNameCol 这个就是角色名

 

 

 

Tomcat 最终通过查询出rolename来决定你的访问权限。

在/WEB-INF/web.xml里面配置

<security-constraint>
  <display-name>OpenI Security Constraint</display-name>
  <web-resource-collection>
   <web-resource-name>Protected Area</web-resource-name>
   <url-pattern>*.jsp</url-pattern>
   <url-pattern>*.html</url-pattern>
   <url-pattern>*.htm</url-pattern>
   <url-pattern>*.iface</url-pattern>
   <url-pattern>*.faces</url-pattern>
   <url-pattern>*.jspx</url-pattern>
   <url-pattern>*.xml</url-pattern>
   <url-pattern>/rss</url-pattern>
   <url-pattern>/StreamChart</url-pattern>
  </web-resource-collection>
  <auth-constraint>
     <role-name>openi</role-name>
  </auth-constraint>
 </security-constraint>

 

 以上是指定 role_name为openi的用户可以访问 web-resource-collection 标签里面的所有 url-pattern

 

然后配置登陆异常的页面了

 <login-config>
  <auth-method>FORM</auth-method>
  <realm-name>OpenI 2.0</realm-name>
  <form-login-config>
   <form-login-page>/login.jsp</form-login-page>
   <form-error-page>/login.jsp?login_failed</form-error-page>
  </form-login-config>
 </login-config>

 

差不多就这样,但是实际中远远不止这么些

 

如:我们一般再增加一个自己的Filter来获得认证后的用户具体信息

 

 

 <filter>
  <filter-name>AuthorizationFilter</filter-name>
  <filter-class>org.openi.security.AuthorizationFilter</filter-class>
  <init-param>
   <param-name>project_list_page</param-name>
   <param-value>projectlist.htm</param-value>
  </init-param>
 </filter>

 

上面是自定义的Filter

<filter>
  <filter-name>WcfJspFilter</filter-name>
  <filter-class>org.openi.web.RequestFilter</filter-class>
  </filter> 
 <filter-mapping>
  <filter-name>AuthorizationFilter</filter-name>
  <url-pattern>*.iface</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>AuthorizationFilter</filter-name>
  <url-pattern>*.faces</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>AuthorizationFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>AuthorizationFilter</filter-name>
  <url-pattern>*.jspx</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>AuthorizationFilter</filter-name>
  <url-pattern>*.htm</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>LogoutFilter</filter-name>
  <url-pattern>/killsession</url-pattern>
 </filter-mapping>
 <filter-mapping>
  <filter-name>WcfJspFilter</filter-name>
  <url-pattern>*.jsp</url-pattern>
 </filter-mapping>

 对相关的url访问过滤,在登陆成功之后 转向主页面时候会通过这个Filter

 

package org.openi.security;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.openi.application.Application;
import org.openi.project.ProjectContext;
import org.openi.users.User;
import org.openi.users.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class AuthorizationFilter implements Filter {
	//private static final String APP_FILE_PATH = "/WEB-INF/application.xml";
	
	private static Logger logger = Logger.getLogger(AuthorizationFilter.class);
	
	private FilterConfig filterConfig;
	
	public void init(FilterConfig filterConfig) {
		this.filterConfig = filterConfig;
	}
	
	
	public static final String OPENI_ROLE_NAME = "openi";
	public static final String APP_ADMIN_ROLE_NAME = "app_admin";

	
	public void doFilter(ServletRequest request, ServletResponse response,
    		FilterChain chain) throws IOException, ServletException {
		ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(filterConfig.getServletContext());
		ProjectContext projectContext = (ProjectContext)appContext.getBean("projectContext");
		//request.setCharacterEncoding("UTF-8");
		/*
		Enumeration names = request.getParameterNames();
		while(names.hasMoreElements()) { 
			 String name = (String)names.nextElement();
			 String values[] = request.getParameterValues(name);
			 for(int i=0;i<values.length;i++) 
			 { 
				 values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");//(values[i]);
			 }
		}
	    */
		HttpServletRequest servletRequest = (HttpServletRequest) request;
		/*logger.info("---------------------servletRequest.getRequestURI() : " + servletRequest.getRequestURI());
		logger.info("---------------------servletRequest.getCharacterEncoding() : " + servletRequest.getCharacterEncoding());
		logger.info("---------------------servletRequest.getAttribute() : " + servletRequest.getAttribute("content"));
		logger.info("---------------------servletRequest.getParameter() : " + servletRequest.getParameter("content"));
		logger.info("---------------------servletRequest.getParameter(contentNow) : " + servletRequest.getParameter("contentNow"));
		logger.info("---------------------servletRequest.getQueryString() : " + servletRequest.getQueryString());
		logger.info("---------------------servletRequest.getRequestURI() : " + servletRequest.getRequestURL().toString());
		logger.info("---------------------servletRequest.getServletPath() : " + servletRequest.getServletPath());
		;
		*/
		// Glashfish invokes request filter before login, so check UserPrincipal for null
		
		if (projectContext.getUser() == null && servletRequest.getUserPrincipal() != null) {
			String userName = servletRequest.getUserPrincipal().getName();
			User user = null;
			try {
				UserService userService = (UserService)appContext.getBean("userService");
				if (userService != null) {
					user = userService.getUserById(userName);					
				}
			} catch (Throwable t) {}
			
			if (user == null) {
				user = new User();							
			} 
			
			if (user.getLanguage() == null ||  "".equals(user.getLanguage())) {
				user.setLanguage(servletRequest.getLocale().getLanguage());	
			} 
			
			user.setName(userName);	
			
			projectContext.setUser(user);
			if (servletRequest.isUserInRole(OPENI_ROLE_NAME)) {
				if (servletRequest.isUserInRole(APP_ADMIN_ROLE_NAME)) {
					projectContext.configureRoles(true, false, false);
				}/* else if (projectContext.getProject() != null 
						&& servletRequest.isUserInRole(projectContext.getProject().getProjectId() + " )) {
					if (servletRequest.isUserInRole(PRJ_ADMIN_ROLE_NAME)) {
						projectContext.configureRoles(false, true, false);
					} else if (servletRequest.isUserInRole(PRJ_USER_ROLE_NAME)) {
						projectContext.configureRoles(false, false, true);
					}
				}*/
			}
		}
		
		if (projectContext.getProject() == null && servletRequest.getUserPrincipal() != null) {
			try {
				if (!Application.isLoaded()) {
					((HttpServletRequest)request).getRequestDispatcher("/WEB-INF/pages/create_project.iface").forward(request, response);
					return;
				} else {
					logger.warn("project content directory is missing");
					
					if(!servletRequest.getRequestURI().endsWith("project_list.iface") 
							&& !servletRequest.getRequestURI().endsWith("blank.iface")){
						((HttpServletResponse)response).sendRedirect("project_list.iface");
						//((HttpServletRequest)request).getRequestDispatcher("project_list.iface").forward(request, response);
						return;
					}
				}				
			} catch (Exception e) {
				throw new ServletException("could forward request", e);
			}
		}
		/*
		Enumeration names1 = request.getParameterNames();
		while(names1.hasMoreElements()) { 
			 String name = (String)names1.nextElement();
			 String values[] = request.getParameterValues(name);
			 for(int i=0;i<values.length;i++) 
			 { 
				 values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");//(values[i]);
			 }
		}
		*/
		chain.doFilter(request, response);
	}
	
	public void destroy() {
				
	}
	
	
}

 通过上面这个类就可以获得用户的具体信息,从而得到细粒度的控制。

 

 

完毕。高手不吝赐教!

分享到:
评论

相关推荐

    JAAS认证(mac版tomcat)

    通常,Tomcat使用`MemoryRealm`或`UserDatabaseRealm`,但为了使用JAAS,你需要改为`JAASRealm`。例如: ```xml &lt;Realm className="org.apache.catalina.realm.JAASRealm" appName="myApp" userClassNames=...

    使用Tomcat验证LDAP by openDJ

    【标题】"使用Tomcat验证LDAP by openDJ" 涉及到的知识点主要集中在两个核心领域:Apache Tomcat服务器和 Lightweight Directory Access Protocol (LDAP)。在这个场景中,openDJ作为一个开源的LDAP服务器,用于存储...

    tomcat7.0.42源码,eclipse直接使用

    【标题】"Tomcat7.0.42源码,eclipse直接使用" 【内容】: Tomcat7.0.42是Apache Tomcat服务器的一个版本,它是一个开源的Java Servlet容器,主要用于实现Java Servlet和JavaServer Pages(JSP)技术。这个版本的...

    tomcat8安装包(含windows和linux版本).zip

    同时,熟悉Tomcat的安全设置,如用户角色、 Realm配置以及防火墙规则,是确保服务器安全运行的关键。 总之,Tomcat 8是一个强大且灵活的Java Web服务器,适用于开发、测试和生产环境。无论是在Windows还是Linux上,...

    tomcat6的源码

    2. **线程模型**:Tomcat使用了多线程模型来处理并发请求。源码中的`Catalina`和` Coyote`组件涉及到了这部分内容,包括Acceptor线程和Worker线程的管理。 3. **生命周期管理**:每个Tomcat组件都有自己的生命周期...

    Tomcat 8 免安装版本

    下面将详细介绍Tomcat 8的主要特性和使用方法。 1. **主要特性** - **轻量级**:Tomcat 8是轻量级的服务器,占用资源少,适合小型到中型的应用。 - **遵循标准**:完全支持Java Servlet 3.1和JSP 2.3规范,为开发...

    Tomcat 接口文档 API

    开发者可以使用Realm组件进行身份验证,定义AccessControlList来控制访问权限。 在学习Tomcat API时,阅读官方文档和示例代码是十分重要的。对于英文基础良好的开发者来说,直接阅读API文档能更深入地理解Tomcat的...

    tomcat配置ldap权限验证

    Realm是Tomcat中的一个组件,负责身份验证和权限控制。这里使用的是JNDIRealm,即Java Naming and Directory Interface Realm,它可以连接到LDAP服务器并进行身份验证。 Realm元素的各个属性的解释: * className...

    tomcat 8.5.100

    - **server.xml**:这是Tomcat的主要配置文件,包含了关于连接器、监听器、 Realm(认证)和其他服务器设置的信息。 - **web.xml**:每个Web应用都有一个web.xml,用于定义Servlet、过滤器和监听器等。 - **...

    apache-tomcat-7.0.57(32位)

    在conf/server.xml中,你可以配置Realm(域)来管理用户和角色,并使用Context元素设置应用级别的安全性。 管理Tomcat可以通过管理工具实现,例如Tomcat管理员(位于http://localhost:8080/manager/html)和Host ...

    Tomcat配置方法 Tomcat配置方法 Tomcat配置方法

    Tomcat是一款广泛使用的开源Java应用服务器,主要用于部署和运行Servlet和JSP应用。本文将深入探讨Tomcat的配置方法,帮助你更好地理解和管理你的Web应用。 首先,让我们从基础开始,了解Tomcat的目录结构。在解压...

    apache-tomcat-6.0.37

    Apache Tomcat 6.0.37 是一个广泛使用的开源软件,它是一个符合Java Servlet和JavaServer Pages(JSP)规范的应用服务器,专门用于运行基于Java的Web应用程序。Tomcat作为轻量级的Web服务器和应用服务器,因其简单、...

    apache-tomcat-8.0.35.exe下载

    Apache Tomcat 8.0.35 是一个广泛使用的开源软件,它是一个实现了Java Servlet、JavaServer Pages(JSP)和Java EE的Web应用程序容器。这个版本是专门为在Windows操作系统环境下运行而设计的,特别是针对x86架构的...

    tomcat 系列 tomcat 系列

    此外,Tomcat 7加强了安全管理,如增强的 Realm 配置,为开发者提供了更强大的安全控制。 再往后,Tomcat 8.x系列则顺应了Java EE 7的发展,支持Servlet 3.1、JSP 2.3以及WebSocket等新特性。这个版本的Tomcat在...

    tomcat7源码下载

    Tomcat7是一款广泛使用的开源Java Servlet容器,它实现了Java EE中的Web应用服务器标准,尤其是Servlet和JSP规范。源码下载是开发者深入理解其内部工作原理的重要途径,本篇文章将围绕Tomcat7源码进行详细探讨。 一...

    tomcat7 64位

    7. **安全性**:Tomcat的安全配置主要涉及`conf/server.xml`中的`&lt;Realm&gt;`元素,以及`conf/context.xml`和应用级别的`WEB-INF/web.xml`中的安全约束。SSL/TLS可以通过配置`server.xml`中的`&lt;Connector&gt;`元素启用,以...

    tomcat7.0.109下载

    6. **安全管理**:Tomcat提供了基于角色的访问控制(RBAC),可以在`conf/tomcat-users.xml`文件中定义用户和角色,通过`&lt;Realm&gt;`元素配置认证方式。 7. **JNDI资源**:Tomcat支持JNDI(Java Naming and Directory ...

    tomcat源码

    2. **线程池管理**:Tomcat如何使用Executor(`Executor`接口和`ThreadPoolExecutor`实现)来管理线程,提高并发性能。 3. **会话管理**:Tomcat如何实现Session跟踪,包括Cookie、URL重写和基于数据库的持久化策略...

    Tomcat6.0(apachetomcat.exe)

    1. **用户角色与Realm**:Tomcat支持多种Realm实现,如MemoryRealm(内存中存储用户信息)、JDBCRealm(通过数据库验证用户)等,可以定义不同角色的访问权限。 2. **Web应用程序安全配置**:在web.xml中配置...

    apache-tomcat-6.0.44

    7. **安全管理**:Tomcat允许配置 Realm 来进行用户身份验证,如`conf/tomcat-users.xml`,并可以通过`web.xml`定义角色和安全约束。 8. **集群与负载均衡**:Tomcat 6.0支持集群配置,通过复制会话数据实现多台...

Global site tag (gtag.js) - Google Analytics