Tomcat <Realm>配置

JDBCRealm 概述

JDBCRealm是tomcat 6 对Realm接口的实现,它通过JDBC驱动程序访问关系数据库。它的遍历配置可以适应于您已有的表和列名,只要您的数据库接口符合下列规范:

1. 必须有一张用户表,包含Realm可以识别的所有合法用户名称的行。 

用户表必须包含至少两列:

  当用户登录时,Tomcat可以识别用户名。

  当用户登录时,Tomcat可以识别用户密码。

2. 必须有一张用户角色表,包含关联特殊用户的每种合法角色的行。用户有0个,1个或多个角色都是允许的。

用户角色表必须包含至少两列: 

   Tomcat可以识别的用户名(和用户表中的相应值一致)。

   用户关联的合法角色名。

 

快速入门需要以下步骤设置Tomcat使用JDBCRealm:

1. 创建以上描述中必须的表和列。

2. 配置使用Tomcat的用户名和密码,至少需要有只读权限(Tomcat不会修改表中数据)。

3. 拷贝JDBC驱动程序到$CATALINA_HOME/lib目录。(注意:单纯的放在项目的lib下是不可以的,要放到tomcat的lib目录下)

4. 在您的$CATALINA_HOME/conf/server.xml文件中设置元素,或者通过jndi方式加载项目,则可以在 $CATALINA_HOME/conf/localhost 下增加 项目.xml,此文件里设置元素

5. Realm元素属性要配置JDBCRealm,以下是这个实现支持的参数:

className Realm实现的java全名。在这里必须“org.apache.catalina.realm.JDBCRealm”;

connectionName 建立JDBC连接的用户名;

connectionPassword 建立JDBC连接的密码;

connectionURL 建立JDBC连接的URL;

digest 使用非明文方式保存用户密码的摘要算法。只能输入java.security.MessageDigest支持的算法名称。如果不指定,密码以明文方式保存;

driverName 使用的JDBC驱动程序全名。详细信息请查看您使用的JDBC驱动程序;

roleNameCol 用户角色表中的角色名,包含赋予用户的角色;

userCredCol 用户表中列名,包含用户的密码(可以是明文也可以是密文);

userNameCol 用户和用户角色表中的列表,包含了用户名;

userRoleTable 用户角色表。表中必须有userNameCol和roleNameCol中指定的列;

userTable 用户表。表中必须有userNameCol列;

 

例子:

 

Tomcat6.0+ XXX系统

1. 数据库准备

数据库里建立2张表或者2个视图也可以。(以下以视图为例)

用户表:

create or replace view users as

    select col1  username, col2  password  from table1

 

用户角色表:

create or replace view roles as
   select col1  username, col3   role   from  table1

 

2.tomcat采用jndi的方式加载系统,所以在conf\Catalina\localhost下增加一个xml文件,文件内容如下:

 

Xml代码  
  1. <Context path="XXX" reloadable="true" docBase="****">  
<Context path="XXX" reloadable="true" docBase="****">
Xml代码  
  1. <Realm className="org.apache.catalina.realm.JDBCRealm"    
  2. debug="99" driverName="oracle.jdbc.driver.OracleDriver"    
  3. connectionURL="jdbc:oracle:thin:@ip:port:sid"  
  4. connectionName="test" connectionPassword="test"  
  5. userTable="users" userNameCol="username" userCredCol="password"  
  6. userRoleTable="roles" roleNameCol="role" />  
<Realm className="org.apache.catalina.realm.JDBCRealm" 
debug="99" driverName="oracle.jdbc.driver.OracleDriver" 
connectionURL="jdbc:oracle:thin:@ip:port:sid"
connectionName="test" connectionPassword="test"
userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="roles" roleNameCol="role" />
Xml代码  
  1. <Resource ....略.../>  
<Resource ....略.../>
Xml代码  
  1. </Context>  
</Context>

xml解析:

userTable="users"     用户表:对应数据视图 users

userNameCol="username"   列名称:对应数据库视图 users的username列

userCredCol="password"    列名称:对应数据库视图 users的password列


userRoleTable="roles"   用户角色表:对应数据库视图 roles

roleNameCol="role"       列名称:      对应数据库视图 roles的role列

 

3. XXX项目的web.xml文件配置

 

Xml代码  
  1. <security-constraint>  
  2.  <display-name>admin</display-name>  
  3.  <web-resource-collection>  
  4.   <web-resource-name>Secure</web-resource-name>  
  5.   <url-pattern>*.do</url-pattern>     <!--制定应该保护的URL-->  
  6.   <http-method>GET</http-method>  
  7.   <http-method>POST</http-method>  
  8.  </web-resource-collection>  
  9.  <auth-constraint>                 <!--允许以下角色访问受保护的URL-->  
  10.   <description>constraints</description>      
  11.   <role-name><SPAN style="COLOR: #000000">DataManage</SPAN></role-name>    <!--角色名称-->  
  12.  </auth-constraint>  
  13.  <user-data-constraint>  
  14.   <transport-guarantee>NONE</transport-guarantee>  <!--将对所用的通讯协议不加限制-->  
  15.  </user-data-constraint>  
  16. </security-constraint>  
 <security-constraint>
  <display-name>admin</display-name>
  <web-resource-collection>
   <web-resource-name>Secure</web-resource-name>
   <url-pattern>*.do</url-pattern>     <!--制定应该保护的URL-->
   <http-method>GET</http-method>
   <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>                 <!--允许以下角色访问受保护的URL-->
   <description>constraints</description>   
   <role-name>DataManage</role-name>    <!--角色名称-->
  </auth-constraint>
  <user-data-constraint>
   <transport-guarantee>NONE</transport-guarantee>  <!--将对所用的通讯协议不加限制-->
  </user-data-constraint>
 </security-constraint>
Xml代码  
  1.  <login-config>           
  2.   <auth-method>FORM</auth-method>  
  3.   <form-login-config>  
  4.    <form-login-page>/login.jsp</form-login-page>         <!--访问受包含的url时,先跳转到该页面-->  
  5.    <form-error-page>/error.jsp</form-error-page>        <!--判断用户没有权限访问时,跳转到该页面-->  
  6.   </form-login-config>  
  7.  </login-config>  
 <login-config>        
  <auth-method>FORM</auth-method>
  <form-login-config>
   <form-login-page>/login.jsp</form-login-page>         <!--访问受包含的url时,先跳转到该页面-->
   <form-error-page>/error.jsp</form-error-page>        <!--判断用户没有权限访问时,跳转到该页面-->
  </form-login-config>
 </login-config>

 

通过以上配置,可以限定只有有DataManage角色权限的用户才能访问系统中所有包含.do的页面,从广义上讲即可限定哪些用户才能访问系统。

访问顺序:先跳转到 longin.jsp页面,页面提交后,进行安全检查,判断用户是否有权限,有权限再跳回原本访问的.do页面进行正常访问,否则跳到error.jsp

 

login.jsp页面部分代码:

 

Html代码  
  1. <form name="loginForm" method="POST" action="j_security_check" >  
  2. <table>  
  3. <tr>  
  4.    <td><input type='text' name='username' ></td>  
  5.    <td><input type='text' name='password' ></td>  
  6. </tr>  
  7. <tr>  
  8.    <td><input type='submit' name='sub' ></td>  
  9. </tr>  
  10. </table>  
  11. </form>  
<form name="loginForm" method="POST" action="j_security_check" >
<table>
<tr>
   <td><input type='text' name='username' ></td>
   <td><input type='text' name='password' ></td>
</tr>
<tr>
   <td><input type='submit' name='sub' ></td>
</tr>
</table>
</form>

注意: action="j_security_check" ,该action进行安全检查。(<security-constraint>的作用,该action在web.xml是不用定义的。。。直接用)

 

如本例子,用户表:

username    password                        

 test1           123456                      

 test2           123456

 test3           123456

.......

用户角色表:

username        role

 test1               guest

 test2               DataManage

 test3               DataManage

........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值