平时课堂上的方法都是用户输入账号密码然后到数据库中去匹配,整个过程都是我们自己写代码去完成的。但是servlet容器例如tomcat本身就带了这种认证的功能,而且很强大,甚至能控制到每个类每个方法。下面我们讨论一下最常用的基于Form表单的认证方式。
一、建立数据库,以 mysql 数据库为例:
CREATE DATABASE DEMO
二、建立表,表一共有三个,一个是用户表 userinfo,保存用户名和密码;一个是权限userrole,表保存权限角色;还有一个是用户和权限对照的表user_roles;
CREATE TABLE `userinfo` (
`username` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `userrole` (
`role` varchar(20) NOT NULL,
UNIQUE KEY `iduserrole_UNIQUE` (`role`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_roles` (
`username` varchar(45) NOT NULL,
`role` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
三、向表中插入数据
INSERT INTO `userinfo` VALUES ('user1','password1');
INSERT INTO `userrole` VALUES ('admin');
INSERT INTO `user_roles` VALUES ('user1','admin');
四、新建一个web工程
![创建web工程 创建web工程](https://i-blog.csdnimg.cn/blog_migrate/85fcef064016c155b3ec5f8f25b6a34b.jpeg)
五、配置tomcat配置文件server.xml
在 <GlobalNamingResources></GlobalNamingResources>标记之间加入如下代码:
<Resource auth="Container"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
name="UserDatabase" pathname="conf/tomcat-users.xml"
type="org.apache.catalina.UserDatabase"/>
<Resource auth="Container"
driverClassName="com.mysql.jdbc.Driver"
type="javax.sql.DataSource"
maxActive="4"
name="jdbc/demo"
password="数据库密码"
url="jdbc:mysql://localhost:3306/demo"
username="root"
validationQuery="select 1 from userinfo"/>
在 <Engine defaultHost="localhost" name="Catalina"></Engine>标记之间加入如下代码:
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/demo"
roleNameCol="ROLE"
userCredCol="PASSWORD"
userNameCol="USERNAME"
userRoleTable="USER_ROLES"
userTable="USERINFO"/>
</Realm>
六、配置web.xml,描述需要保护的资源,以及需求的权限:
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>DELETE</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<resource-ref>
<description>MySQL DB Connection Pool</description>
<res-ref-name>jdbc/demo</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
七、建立登陆界面login.jsp(根据上面<form-login-page>中的配置)
<form action="j_security_check">
用户名<input name="j_username" id="j_username" type="text" />
密码<input name="j_password" id="j_password" type="password"/>
<input type="submit" value="登录" />
</form>
注意:form标签的action值必须为j_security_check,同样用户名的name属性值必须为j_username,密码的name属性必须为j_password
八、建立登陆失败界面error.jsp
ERROR
页面随便写一些登陆失败的提示即可。
九、启动tomcat服务器
十、测试:
在浏览器输入http://localhost:8080/demo/index.html
这时就会跳转到登陆界面login.jsp,输入用户名和密码后tomcat会根据server.xml配置文件中指定的表和列去进行认证,认证成功即用户名、密码、权限均正确则返回用户请求的资源,例如上面的地址请求的index.html。如果用户名、密码、权限有一个不正确则不能认证成功。
十一、备注:
tomcat的认证十分强大,除包含Form表单的认证方式之外还包含智能卡等认证方式,通过对web.xml的配置可以精确的限制各种资源的访问权限。如果读者有兴许可以继续深入探索