servlet 认证,授权

来源:互联网 发布:苹果udid定制软件 编辑:程序博客网 时间:2024/05/01 12:31

http://blog.csdn.net/linshizhan/article/details/7792707

 servlet安全分为四类:认证,授权,数据完整性,机密性。

     有时候我们的某个网页,可能不允许所有人查看,如有些机密消息只有高级会员查看,这时候我们该如何处理?我们怎么判断访问网页的这个人就是本人,而不是其他人冒充的呢?

    servlet中的认证和授权就能解决这个问题,认证就是验证是否是本人,验证是否是本人的方法就是能否输入正确的用户名和密码。授权就是用户账户和密码匹配后,查看该用户的角色,是否有查看相关资源的权限。

    在tomcat中conf文件夹下tomcat-users.xml中,我们可以定义角色 和相应账户的账户名,密码,和角色信息。

   

[html] view plaincopyprint?
  1. <tomcat-users>  
  2.    <role rolename="member"/>  
  3.    <role rolename="guest"/>  
  4.    <user username="shizhan" password="shizhan" roles="member"/>  
  5.    <user username="xxx" password="xxx" roles="guest"/>  
  6. </tomcat-users>  

 

   例如上面我们声明了member和guest两个角色。

   并且声明了两个用户,shizhan和xxx,角色分别为member和guest。

   在web.xml中,我们可以通过 <security-role>把我们定义的角色告诉web应用。

   

[html] view plaincopyprint?
  1. <security-role>  
  2.     <role-name>member</role-name>  
  3.   </security-role>  
  4.     
  5.  <security-role>  
  6.      <role-name>guest</role-name>  
  7.  </security-role>  


 

    例如现在我们要对url为/TestSafeLogin的servlet进行认证和授权,可以这么声明

     

[html] view plaincopyprint?
  1. <security-constraint>  
  2.       <web-resource-collection>  
  3.          <web-resource-name>demo</web-resource-name>  
  4.          <url-pattern>/TestSafeLogin</url-pattern>  
  5.          <http-method>GET</http-method>  
  6.           <http-method>POST</http-method>  
  7.       </web-resource-collection>  
  8.       <auth-constraint>  
  9.         <role-name>member</role-name>  
  10.       </auth-constraint>  
  11.       <user-data-constraint>  
  12.           <transport-guarantee>CONFIDENTIAL</transport-guarantee>  
  13.       </user-data-constraint>  
  14.   </security-constraint>  


 

    <web-resource-name>demo</web-resource-name>这个标签没有实质作用。

    <url-pattern>/TestSafeLogin</url-pattern>请求哪个servlet必须进行验证。

     <http-method>GET</http-method>  <http-method>POST</http-method>请求这个servlet的get和post请求才进行验证。

      <auth-constraint>
             <role-name>member</role-name>
      </auth-constraint> 表示只有会员这个角色才能查看。

       <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
      </user-data-constraint>表示传输用户名和密码的时候,利用https协议进行加密传输。

    上面定义了只有会员的角色才能对/TestSafeLogin这个资源进行get和post请求,而且用户名和密码传输过程中使用https协议进行传输。

    可是当我们访问了这个资源后,容器利用什么方式要求用户输入用户名和密码呢?

    这里有四种认证方式:

    1:基本认证(采用base64编码)

    2:摘要(digest)认证

    3:客户证书(client-cert)是以一种非常安全的形式进行传输登录信息,使用了公共密钥证书,缺点是客户必须有证书才能登录你的系统。

    4:表单认证(form),可以根据合法的html建立登录表单,四种认证中,表单认证是最不安全的。

    下面我们以表单认证来演示我们的例子。在web.xml中配置

    

[html] view plaincopyprint?
  1. <login-config>  
  2.     <auth-method>FORM</auth-method>  
  3.     <form-login-config>  
  4.        <form-login-page>/login.html</form-login-page>  
  5.        <form-error-page>/loginerror.html</form-error-page>  
  6.     </form-login-config>  
  7. </login-config>  

  表示需要客户输入用户名和密码的时候,跳转到login.html,当输入错误的时候跳转到loginerror.html,并且以表单的方式提交。

   下面看看login.html

   

[html] view plaincopyprint?
  1. <!DOCTYPE html>  
  2. <html>  
  3.   <head>  
  4.     <title>login.html</title>  
  5.   </head>  
  6.     
  7.   <body>  
  8.        
  9.      <form method="post" action="j_security_check">  
  10.                     用户名<input type="text"  name="j_username"/><br/>  
  11.                     密码  <input type="text"  name="j_password"/><br/>  
  12.           <input type="submit" value="登录"/>  
  13.      </form>  
  14.   </body>  
  15. </html>  


 

   其中action的值等于j_security_check,用户名的name是j_username,密码的name是j_password,这些都是规定好的,不可改变。

   既然表单认证是最不安全的,那么怎么保证我们的信息传输的安全性呢?

   其实java ee规范中有传输层的安全性规范,我们可以使用

     <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
      </user-data-constraint>来进行配置,上面我们已经配置过了,他使用的是ssl协议进行加密。

   现在一切都准备好了,我们还必须对tomcat配置ssl协议,其实就是为我们的服务器生成一个证书,大家可以参考网上的资料。

  完毕。

 

0 0
原创粉丝点击