JAAS安全策略的Tomcat实现:为tomcat页面设置访问权限(j_security_check)

原帖发表于 2005-07-23  作者Asktalk

摘自: http://www.blogjava.net/asktalk/archive/2005/07/23/8221.html

web应用中,对页面的访问控制通常通过程序来控制,流程为:
登录 -> 设置session -> 访问受限页面时检查session是否存在,如果不存在,禁止访问

对于较小型的web应用,可以通过tomcat内置的访问控制机制来实现权限控制。采用这种机制的好处是,程序中无需进行权限控制,完全通过对tomcat的配置即可完成访问控制。

为了在tomcat页面设置访问权限控制,在项目的WEB-INFO/web.xml文件中,进行如下设置:

<web-app>

<!--servlet等其他配置-->

<security-constraint>
  <web-resource-collection>
      <display-name>Example Security Constraint</display-name>
      <web-resource-name>My Test</web-resource-name>
   
      <url-pattern>/ddly/admin/*</url-pattern>
  </web-resource-collection>
  
<auth-constraint>
    <role-name>role1</role-name>
    <role-name>tomcat</role-name>
</auth-constraint>

</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>My Test</realm-name>
</login-config>

</web-app>

其中,<url-pattern>中指定受限的url,可以使用通配符*,通常对整个目录进行访问权限控制。
<auth-constraint>
中指定哪些角色可以访问<url-pattern>指定的url,在<role-name>中可以设置一个或多个角色名。

使用的角色名来自tomcat的配置文件${CATALINA_HOME}/conf/tomcat-users.xml

<login-config>中设置登录方式,<auth-method>的取值为BASICFORM。如果为BASIC,浏览器在需要登录时弹出一个登录窗口。如果为FORM方式,需要指定登录页面和登录失败时的提示信息显示页面。

使用FORM方式的配置样例如下:

<login-config>
   <auth-method>FORM</auth-method>
   <realm-name>Example Form-Based Authentication Area</realm-name>
   <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/error.jsp</form-error-page>
   </form-login-config>
</login-config>

 其中的<form-login-page>指定登录页面url<form-error-page>指定登录失败时的提示页面url
登录页面中,formaction,以及其中的用户名和密码两个参数的名称,都应取固定的值。登录的后台处理程序为j_security_check;用户名和密码的参数名称分别为:j_usernamej_password
如下是登录页面(如:login.jsp)的一段示例代码:

<form method="POST" action='<%= response.encodeURL("j_security_check") %>' >
  <table border="0" cellspacing="5">
    <tr>
      <th align="right">Username:</th>
      <td align="left"><input type="text" name="j_username"></td>
    </tr>
    <tr>
      <th align="right">Password:</th>
      <td align="left"><input type="password" name="j_password"></td>
    </tr>
    <tr>
      <td align="right"><input type="submit" value="Log In"></td>
      <td align="left"><input type="reset"></td>
    </tr>
  </table>
</form>

 

相关衍生阅读:http://callan.iteye.com/blog/158392

http://ikeepu.com/bar/10112580

可直接在sun 或者Tomcat官网查看配置说明.

 

Tomcat配置实例:

<?xml version='1.0' encoding='utf-8'?>

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <GlobalNamingResources>
	<Resource auth="Container" driverClassName="oracle.jdbc.driver.OracleDriver" 
		logAbandoned="true" maxActive="20" maxIdle="10"
		maxWait="10000" 
		name="waiqin_res" 
		username="waiqin"
		password="waiqin" 
		removeAbandoned="true"
		removeAbandonedTimeout="60" 
		type="javax.sql.DataSource" 
		url="jdbc:oracle:thin:@ip:port:实例名" />    	<Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>


  <Service name="Catalina">
  


    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />


     <Connector port="8443"   protocol="HTTP/1.1"
               maxThreads="150"  SSLEnabled="false'"
               enableLookups="false" disableUploadTimeout="true" 
               clientAuth="false"  /> 

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    <Engine name="Catalina" defaultHost="localhost">



      <Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="自定义1" roleNameCol="role_name" userCredCol="password" userNameCol="account" userRoleTable="v_user_role" userTable="v_account_password"/>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

       <Context docBase="webapp名" path="/webapp名" reloadable="true">
      	 <ResourceLink global="自定义1" name="自定义1" type="javax.sql.DataSource"/>
      </Context>
      </Host>
    </Engine>
  </Service>
</Server>

 

猜你喜欢

转载自redcoatjk.iteye.com/blog/1987809
今日推荐