一:Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密和会话管理。
Authentication:身份认证/登录,验证用户是不是拥有相应的身份
Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,即判断用户是否能做事情,常见的如:
验证某个用户是否拥有某个角色,或者细粒度的验证某个用户对某个资源是否具有某个权限
Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有的信息都在会话中,会话可以是普通JavaSe环境的,也可以是web环境的
Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储
Shiro有三大核心组件:
Subject:当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中
则需要通过Subject来提供基础的当前用户信息,所有的Subject都要绑定到SecurityManager上,与Subject的交互实际上是被转换成与SecurityManager的交互
SecurityManager:即所有Subject的管理者,可以看作是Shiro框架的全局管理组件,用于调度各种Shiro框架的服务,作用类似于SpringMVC中的DispatcherServlet,用于拦截所有请求并进行处理
Realm:是用户的信息认证器和用户的权限认证器,我们需要自己实现Realm来自定义的管理我们自己系统内部的权限规则,SecurityManager要验证用户,需要从Realm中获取用户,可以把Realm看作是数据源
三者之间的联系:
一个简单的shiro应用是,应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager
我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断
Authenticator:认证器,负责主体认证的
Authrizer:授权器
public class ShiroTest {
public static void main(String[] args) {
Factory<SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro.ini");
//要指定读取的配置文件,返回的是一个Factory对象
SecurityManager securityManager = factory.getInstance();
//调用Factory的getInstance()方法获得SecurityManager
SecurityUtils.setSecurityManager(securityManager);
//通过SecurityUtils的setSecurityManager把SecurityManager绑定到上下文中
Subject subject = SecurityUtils.getSubject();
//获得与当前系统进行交互的对象
UsernamePasswordToken token = new UsernamePasswordToken("test", "000000");
try {
subject.login(token);//登录操作
if (subject.isAuthenticated()) {
System.out.println("登录成功");
if (subject.hasRole("admin")) {
System.out.println("有admin角色");
} else {
System.out.println("没有admin角色");
}
if(subject.isPermitted("search")){
System.out.println("有search权限");
}else{
System.out.println("没有search权限");
}
if(subject.isPermittedAll("del","update")){
System.out.println("有\"del\",\"update\"权限");
}else{
System.out.println("没有\"del\",\"update\"权限");
}
}
} catch (AuthenticationException e) {
//e.printStackTrace();
System.out.println("用户名或密码错误,登录失败");
}
}
}