Apache Shiro是一个常见并且易用的的Java安全框架,可以很方便的实现执行身份验证、授权、密码和会话管理等功能
它有三个核心组件:Subject, SecurityManager 和 Realms
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
shiro各个组件介绍
UserRealm: 实现鉴权(登录验证) | 授权管理(检查用户是否有权限访问)
SecurityManager: 权限总管
Subject: 授权对象
ShiroConfig: 决定给哪些地址设定权限
简单集成步骤
-
1.依赖导入
- 首先在pom.xml文件中导入
shiro-spring
依赖
- 首先在pom.xml文件中导入
-
2.实现自定义的UserRealm
- 在commons包下自定义一个
继承自AuthorizingRealm
的Realm类
- 在commons包下自定义一个
-
3.实现登录认证的业务逻辑
subject执行登录代码(根据SecurityManager已分配的权限)
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username,password.toCharArray());
try {
subject.login(token);// 执行登录
} catch(Exception ex) {
jsonData = new JsonData(1,ex.getMessage());
}
if(subject.isAuthenticated()){// 为真则登录成功
jsonData = new JsonData(0,"登录成功");
}
- 4.配置Shiro并提供SecurityManager
@Configuration
public class ShiroConfig {
/**
* Shiro权限过滤器的设置
* @param securityManager
* @return
*/
@Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(@Qualifier("securityManager") SecurityManager securityManager) {
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(securityManager);
bean.setLoginUrl("/sys/toLogin");// 设置登录地址,鉴权失败时返回这个地址
// 权限的全局设置
Map<String,String> auths = new HashMap<String, String>();
auths.put("/sys/toLogin", "anon");// anon表示该地址无需权限访问
auths.put("/sys/doLogin", "anon");
auths.put("/**", "anon");
bean.setFilterChainDefinitionMap(auths);
return bean;
}
/**
* 给SecurityManager分配Realm
* @return
*/
@Bean(name = "securityManager")
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(new MyUserRealm());
return securityManager;
}
}
更进一步
-
1.所有未授权的未登录不能访问
- 静态资源需要开放
- 未登录只能访问anno地址
- 已登录可以访问所有authc的地址
-
2.基于MD5加密实现登录
- 要在UserRealm中连接数据校验
-
3.基于角色的权限控制
- 1)Shiro的精细权限控制:授权 | 定义权限
-
2)基于角色的权限基本表结构:对应数据库中的表结构
- 用户表
- 角色表
- 权限表
- 关联表:用户-角色表 | 角色-权限表
- 4.任何地方可得到当前登录用户的信息
- 5.权限和菜单要对应
参考网址
shiro的基本配置
https://www.cnblogs.com/hyyq/...
shiro的权限控制
https://blog.csdn.net/Lvlht/a...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。