一.步骤总结
1.定义一个类MyRelam,让它继承AuthenticatingRealm
2.重写doGetAuthenticationInfo方法,在里面进行认证,这个方法的参数就是Token,也就是客户端传过来的用户名和密码
3.获取Token中的username和password
UsernamePasswordToken token = (UsernamePasswordToken) upToken;
String username = token.getUsername();
char[] password = token.getPassword();
4.根据用户名从数据库中查询用户
//从数据库中查询数据
try {
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "admin");
PreparedStatement ps = connection.prepareStatement("select * from t_shiro where username=?");
ps.setString(1, username);
ResultSet rs = ps.executeQuery();
User user = null;
if (rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setSalt(rs.getString("salt"));
}
5.判定user是否为空,如果为null,则直接抛UnknownAccountException异常
if (user == null) {
throw new UnknownAccountException("用户名不存在");
}
6.不为空的话就新建SimpleAuthenticationInfo对象,并返回该对象
新建的时需要传入三个参数:
1)第一个参数:这个参数的作用是在授权时根据这个参数去数据库中查询用户,一般是传入整个对象,或者是对象的id
2)第二个参数是从数据库查询出来的密码
3)第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字
if(username.equals("admin")){//假设用户名为admin时能从数据库中查询出来
//根据之前查询出来的用户信息获取密码。假设查询出来的密码是pwd
String password= "pwd";
//此处需要注意,第二个参数是从数据库查询出来的密码,而不是传递过来的密码。
//第三个参数自定义。但是尽量不重复了。常直接使用用户名当做realname名字。
AuthenticationInfo info = new SimpleAuthenticationInfo(user,password,"realmname");
//shiro会判断从数据库查询出来的密码和客户端传递过来的密码是否一致。
return info;
7.在ini文件中配置
[main]
myrealm= com.yrp.realm.MyRealmAuthorizing
securityManager.realms=$myrealm