我主要解释下几个对象:
Subject :主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager :安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
Realm: 域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色/权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
也就是说对于我们而言,最简单的一个 Shiro 应用:
1、 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
2、 我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法
的用户及其权限进行判断。建议看不懂的可以先直接看完下面的4个案例,再回头看看就很明白了。^_^
详细图如上面所示:在这里就不介绍具体每个组件了,我会在以下4个实例代码中详细说明;
4、项目中用到的依赖:

添加完依赖,以下所有实例都可以直接运行。
二、第一个实例(初识Shiro认证/授权)
1、Shiro认证/授权过程:代码有详解
认证原理:创建SecurityManager---->主体提交认证请求----->提交到SecurityManager认证---->SecurityManager认证是由Authenticator进行认证---->Authenticator认证需要通过Realm验证用户数据。
授权原理:创建SecurityManager---->主体授权---->提交到SecurityManager授权---->SecurityManager授权是有Authorizer进行授权---->Realm获取角色权限数据
public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm=new SimpleAccountRealm(); @Before public void getAccount() { //方便测试 新增用户和角色权限 simpleAccountRealm.addAccount("quentin","123456","admin"); } @Test public void AuthenticationTest() { //1、创建SecurtyManager DefaultSecurityManager defaultSecurityManager=new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //2、主体认证/授权 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject=SecurityUtils.getSubject();//获得当前正在执行程序的用户 UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("quentin","123456"); //3、login()主体认证请求,里面封装好的不用管,它是由SecurityManager认证->Authenticate认证->Realm验证组成,这样就可以实现认证。 subject.login(usernamePasswordToken); System.out.println("isAuthen:"+subject.isAuthenticated()); //3、checkRole()主体授权请求,里面封装好的不用管,它是由SecurityManager授权->Authenticate授权->Realm获取角色权限组成,这样就可以实现授权功能。 subject.checkRole("admin"); } }
运行结果:

当验证不通过会抛出异常,没有权限也会抛出异常!!
所以,总结一下整个流程,以认证为例:就是在我们调用Subject的login()方法之后,可以看到我传入的是用户的token(里面的实际原理不用管,其实就是第一第二步它经历过一系列的步骤,它调用了Realm中的doGetAuthenticationInfo(token)方法)。
三、第二个实例(IniRealm实例讲解)
介绍:通过加载
.ini文件生成realm对象来验证1、在resourses中建立user.ini文件,内容如下:
设置用户名"quentin",密码是"123456",“admin”角色,"admin"拥有“user:delete、user:update”权限。
2、实例文件代码如下:
青岛软件培训
可能你正在寻找一家靠谱的IT培训机构,
渴望突破职业瓶颈,
找一份得体的工作。
恰巧万码学堂正在寻找像你这样不甘平凡的追光者!
我们拒绝纸上谈兵,直接参与真实开发流程!
现在行动,未来可期
立即拨打0532-85025005,预约免费职业规划咨询
前20名咨询者赠送《2025高薪技术岗位白皮书》!
你不是在报名课程,而是在投资五年后的自己!

