JAVA全系列 教程
3762个小节阅读:7088.3k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
使用JdbcRealm
认证时,数据库表名、字段名、认证逻辑都不能改变,我们可以自定义Realm进行更灵活的认证。
准备数据表
xxxxxxxxxx
CREATE TABLE `users` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` 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 (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `users` VALUES (1, 'baizhan', '123');
编写实体类
xxxxxxxxxx
@Data
public class Users {
private Integer uid;
private String username;
private String password;
}
编写mapper接口
xxxxxxxxxx
public interface UsersMapper extends BaseMapper<Users> {
}
在启动类加载mapper接口
xxxxxxxxxx
@SpringBootApplication
@MapperScan("com.itbaizhan.myshiro1.mapper")
public class Myshiro1Application {
public static void main(String[] args) {
SpringApplication.run(Myshiro1Application.class, args);
}
}
编写自定义Realm类
xxxxxxxxxx
public class MyRealm extends AuthorizingRealm {
@Autowired
private UserInfoMapper userInfoMapper;
// 自定义认证方法
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
// 1.获取用户输入的用户名
UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
String username = token.getUsername();
// 2.根据用户名查询用户
QueryWrapper<Users> wrapper = new QueryWrapper<Users>().eq("username", username);
Users users = usersMapper.selectOne(wrapper);
// 3.将查询到的用户封装为认证信息
if (users == null) {
throw new UnknownAccountException("账户不存在");
}
/**
* 参数1:用户
* 参数2:密码
* 参数3:Realm名
*/
return new SimpleAuthenticationInfo(users,
users.getPassword(),
"myRealm");
}
// 自定义授权方法
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
return null;
}
}
将自定义Realm放入SecurityManager对象中
xxxxxxxxxx
@Configuration
public class ShiroConfig {
// 自定义Realm
@Bean
public MyRealm myRealm(){
return new MyRealm();
}
// SecurityManager对象
@Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(MyRealm myRealm){
DefaultWebSecurityManager defaultSecurityManager=new DefaultWebSecurityManager();
// 自定义Realm放入SecurityManager中
defaultSecurityManager.setRealm(myRealm);
return defaultSecurityManager;
}
}
无需修改Service和Controller
启动项目,访问登录页http://localhost/login,测试登录功能。
实时效果反馈
1. 在Shiro中,自定义Realm需要继承
A Realm
B AuthorizingRealm
C ShrioRealm
D BaseRealm
2. 在Shiro中,继承AuthorizingRealm需要重写方法
A 自定义认证
B 自定义授权
C 自定义认证和自定义授权
D 以上说法都不对
答案
1=>B 2=>C