发表于: 2018-06-10 22:41:48
1 868
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
学习shiro
Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。Shiro 可以帮助我们完成:认证、授权、加密、会话管理、与 Web 集成、缓存等。
Shiro 不会去维护用户、维护权限;这些需要我们自己去设计 / 提供;然后通过相应的接口注入给 Shiro 即可。
Subject:主体,代表了当前 “用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
Realm:域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
因为先做一个小demo,没有连接数据库,所以先准备一些用户身份/凭据(shiro.ini)
Shiro提供了一个默认的‘common denominator’,这是一个简单的文本配置文件(INI格式)。与XML格式相比,INI格式更加易读、易用并且几乎不需要任何依赖。INI格式可以轻松的配置SecurityManager。
[users]
zhang=123
wang=123
这个ini文件IDEA里面找不到,默认是用txt打开的。找了好久,最后是在装了一个ini4idea的插件,重启后在文件类型里面找到了ini类型的文件
然后建一个简单的测试类试一试
public static void main(String[] args) {
log.info("我的第一个Apache Shiro应用程序");
//我们使用了Shiro的IniSecurityManagerFactory类读取shiro.ini文件。从这个类名我们可以看出Shiro使用设计模式中的工厂模式。
// 代码中的classpath前缀告诉shiro去哪里加载ini文件(支持的前缀还有url:,file:)
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
//得到SecurityManager实例 并绑定给SecurityUtils
//factory.getInstance()函数解析ini文件并返回一个Securitymanager对象,该对象含有配置信息。
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
//获取当前正在执行的用户
Subject currentUser = SecurityUtils.getSubject();
//让我们登录当前用户,以便我们可以检查角色和权限:
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("zhang1", "1123");
token.setRememberMe(true);
try {
//登录,身份验证
currentUser.login(token);
log.info("用户 [" + currentUser.getPrincipal() + "] 成功登录.");
} catch (UnknownAccountException uae) {
log.info("没有 ["+ token.getPrincipal()+" ]这个用户名" );
} catch (IncorrectCredentialsException ice) {
log.info(" [" + token.getPrincipal() + "] 帐户密码不正确!");
} catch (LockedAccountException lae) {
log.info("用户: " + token.getPrincipal() + " 被锁住了," +
"请联系您的管理员以解锁它。");
} catch (AuthenticationException ae) {
//意外情况?, 错误?
}
}
运行结果
用户怎么锁定还不知道,先把异常处理放这里
这里只是进行了一个登陆的验证,没有权限识别,用户账密是在配置文件中的,没有写进数据库
进行权限验证
ini配置
[users]
zhang=123,管理员
wang=123,用户
[roles]
管理员=权限:创建,权限:查看
用户=权限:查看
测试类里面加上
//测试用户类型
if (currentUser.hasRole("管理员")) {
log.info("用户 [" + currentUser.getPrincipal() + "] 是管理员");
} else {
log.info("用户 [" + currentUser.getPrincipal() + "] 是普通用户");
}
//测试一个类型的权限
if (currentUser.isPermitted("权限:查看")) {
log.info("你拥有查看权限");
} else {
log.info("对不起,没有查看权限!");
}
if (currentUser.isPermitted("权限:创建")) {
log.info("你拥有创建权限");
} else {
log.info("对不起,没有创建权限!");
}
//全部完成 - 注销!
currentUser.logout();
System.exit(0);
如果输入的是空账号,不会进行登录,没有任何权限
后来想到这样更直观一些
log.info("查看权限 {}", currentUser.isPermitted("权限:查看"));
log.info("创建权限 {}", currentUser.isPermitted("权限:创建"));
明天计划的事情:(一定要写非常细致的内容)
spring+shiro
遇到的问题:(遇到什么困难,怎么解决的)
收获:(通过今天的学习,学到了什么知识)
评论