Shiro 笔记
-
认证
-
授权
-
加密
-
session 管理
认证
Subject
是一个与系统交互的实体,可以是人,也可以是其他等
调用 SecurityUtils.getSubject()
返回当前Subject
,即当前用户
// 创建 Realm IniRealm iniRealm = new IniRealm("classpath:shiro.ini"); // 将 Realm 给 SecurityManager SecurityManager securityManager = new DefaultSecurityManager(iniRealm); // 将 SecurityManager 赋值给 SecurityUtils SecurityUtils.setSecurityManager(securityManager); // 获取当前 Subject (当前用户) Subject currentUser = SecurityUtils.getSubject(); // 判断是否认证 if (! currentUser.isAuthenticated()) { // 要进行登录的 Token UsernamePasswordToken token = new UsernamePasswordToken("name", "password"); token.setRememberMe(true); try { // 登录-使用 Realm 校验要登录的 Token currentUser.login(token); } catch (UnknownAccountException uae) { log.error("Username Not Found!", uae); } catch (IncorrectCredentialsException ice) { log.error("Invalid Credentials!", ice); } catch (LockedAccountException lae) { log.error("Your Account is Locked!", lae); } catch (AuthenticationException ae) { log.error("Unexpected Error!", ae); } }
Realm 配置文件
[users] user = password, admin user2 = password2, editor [roles] admin = * editor = articles:*
授权
对用户赋予指定的角色,每个角色有特定的权限
// 判断用户是否有特定角色 if (currentUser.hasRole("admin")) { log.info("Welcome Admin"); } else if (currentUser.hasRole("editor")) { log.info("Welcomt Editor"); } else { log.info("Welcome Guest"); } // 判断当前用户是否有特定权限 if (currentUser.isPermitted("articles:compose")) { log.info("You can compose an article"); } else { log.info("You are not permitted to compose an article!"); }
Realm 配置
Realm 是一个 DAO,用来保存用户认证和授权所需要的信息,它可以来自文件也可以来自数据库等
要创建一个 Realm,只需要实现 Realm 接口,框架中有已经实现的 JdbcRealm,可以继承它,覆写下面的方法
doGetAuthenticationInfo()
、doGetAuthorizationInfo()
、getRoleNamesForUser()
与getPermissions()
之后可以与之前IniRealm
同样使用
登出
currentUser.logout();
Session 管理
如果在 Web 环境下,默认使用HttpSession
实现,在独立桌面应用中也可使用
Session session = currentUser.getSession(); session.setAttribute("key", "value"); String value = (String) session.getAttribute("key"); if (val.equals("value")) { log.info("Retrieved the correct value! [" + vallue + "]"); }
集成到 SpringBoot
maven 依赖:
<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-web-starter</artifactId> <version>1.4.0</version> </dependency>
下面需要配置 Realm 与 Shiro security filters
@Bean public Realm realm() { return new MyCustomRealm(); } @Bean public ShiroFilterChainDefinition shiroFilterChainDefinition() { DefaultShiroFilterChainDefinition filter = new DefaultShiroFilterChainDefinition(); filter.addPathDefinition("/secure", "authc"); filter.addPathDefinition("/**", "anon"); return filter; }