微服务 教程
1085个小节阅读:196.3k
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在实际开发中,我们的认证逻辑可能不止一种,例如:
以上情况都需要配置多个Realm进行认证,我们以第二种情况举例,讲解Shiro中多Realm认证的写法:
在数据库创建admin表
xxxxxxxxxx
CREATE TABLE `admin` (
`id` int(11) NOT NULL,
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `admin` VALUES (1, 'baizhan', '123');
INSERT INTO `admin` VALUES (2, 'sxt', '456');
创建Admin实体类和AdminMapper接口
xxxxxxxxxx
public class Admin {
private Integer id;
private String name;
private String password;
}
public interface AdminMapper extends BaseMapper<Admin> {
}
MyRealm
认证User用户,MyRealm2
认证Admin用户
xxxxxxxxxx
public class MyRealm2 extends AuthorizingRealm {
private AdminMapper adminMapper;
// 自定义认证方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 1.获取输入的管理员名
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
// 2.根据管理员名查询管理员
QueryWrapper<Admin> wrapper = new QueryWrapper<Admin>().eq("name", username);
Admin admin = adminMapper.selectOne(wrapper);
// 3.将查询到的管理员封装为认证信息
if (admin == null) {
throw new UnknownAccountException("账户不存在");
}
/**
* 参数1:管理员
* 参数2:密码
* 参数3:Realm名
*/
return new SimpleAuthenticationInfo(admin,
admin.getPassword(),
"myRealm2");
}
// 自定义授权方法
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
}
在SecurityManager中配置Realm
xxxxxxxxxx
// Realm
public MyRealm getMyRealm() {
return new MyRealm();
}
public MyRealm2 getMyRealm2() {
return new MyRealm2();
}
// SecurityManager对象
public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm realm, MyRealm2 realm2){
DefaultWebSecurityManager defaultSecurityManager = new DefaultWebSecurityManager();
// Realm放入SecurityManager中
List<Realm> realms = new ArrayList();
realms.add(realm);
realms.add(realm2);
defaultSecurityManager.setRealms(realms);
return defaultSecurityManager;
}
使用baizhan:123
和sxt:456
测试认证效果
实时效果反馈
1. 在Shiro中,在对象中配置Realm
A Subject
B SecurityManager
C SecurityUtils
D 以上都不对
答案
1=>B