Apache Shiro是一个常见并且易用的的Java安全框架,可以很方便的实现执行身份验证、授权、密码和会话管理等功能
它有三个核心组件:Subject, SecurityManager 和 Realms
Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。
Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作。
SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。
Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。
依赖导入
shiro-spring
依赖 实现自定义的UserRealm
继承自AuthorizingRealm
的Realm类 实现登录认证的业务逻辑
核心代码
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,"登录成功"); }
@Configuration public class ShiroConfig { @Bean("shiroFilter") public ShiroFilterFactoryBean getShiroFilterFactoryBean(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"); auths.put("/sys/doLogin", "anon"); auths.put("/**", "anon");// return bean; } @Bean public SecurityManager securityManager() { DefaultSecurityManager securityManager = new DefaultSecurityManager(); securityManager.setRealm(new MyUserRealm()); return securityManager(); } }