servlet安全分为四类:认证,授权,数据完整性,机密性。
有时候我们的某个网页,可能不允许所有人查看,如有些机密消息只有高级会员查看,这时候我们该如何处理?我们怎么判断访问网页的这个人就是本人,而不是其他人冒充的呢?
servlet中的认证和授权就能解决这个问题,认证就是验证是否是本人,验证是否是本人的方法就是能否输入正确的用户名和密码。授权就是用户账户和密码匹配后,查看该用户的角色,是否有查看相关资源的权限。
在tomcat中conf文件夹下tomcat-users.xml中,我们可以定义角色 和相应账户的账户名,密码,和角色信息。
<tomcat-users>
<role rolename="member"/>
<role rolename="guest"/>
<user username="shizhan" password="shizhan" roles="member"/>
<user username="xxx" password="xxx" roles="guest"/>
</tomcat-users>
例如上面我们声明了member和guest两个角色。
并且声明了两个用户,shizhan和xxx,角色分别为member和guest。
在web.xml中,我们可以通过 <security-role>把我们定义的角色告诉web应用。
<security-role>
<role-name>member</role-name>
</security-role>
<security-role>
<role-name>guest</role-name>
</security-role>
例如现在我们要对url为/TestSafeLogin的servlet进行认证和授权,可以这么声明
<security-constraint>
<web-resource-collection>
<web-resource-name>demo</web-resource-name>
<url-pattern>/TestSafeLogin</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>member</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</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中配置
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.html</form-login-page>
<form-error-page>/loginerror.html</form-error-page>
</form-login-config>
</login-config>
表示需要客户输入用户名和密码的时候,跳转到login.html,当输入错误的时候跳转到loginerror.html,并且以表单的方式提交。
下面看看login.html
<!DOCTYPE html>
<html>
<head>
<title>login.html</title>
</head>
<body>
<form method="post" action="j_security_check">
用户名<input type="text" name="j_username"/><br/>
密码 <input type="text" name="j_password"/><br/>
<input type="submit" value="登录"/>
</form>
</body>
</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协议,其实就是为我们的服务器生成一个证书,大家可以参考网上的资料。
完毕。