Shiro安全框架(1)基础入门案例

简介: 学习Shiro的时候,阅读过很多优秀的文章,比如《跟我学Shiro》系列等等。于是结合自己的实际情况,自己整理了一部分。这是第一篇文章,旨在从基础案例出发了解其原理。

一、认识Shiro


1、简介


Shiro是Apache的一个安全权限框架,比如说我们都遇到过这样一种情况,我们下载完某个软件的时候,然后登陆。突然发现我们可以使用好几种身份去登陆。比如说游客、会员身份、普通用户等。

v2-779f7b3212b5e963a7d246d63629957c_1440w.jpg

我们使用的身份不同,展示的界面是不一样的。Shiro就是要完成这样一个功能,用户以不同的身份登陆,Shiro安全验证之后展示不同的界面。


他的重要性就不说了,只要是个好一点的网站或者是APP都会使用到。


2、功能简介


上面的例子只是让我们认识一下Shiro。我们给出一张完整的功能图,整体来认识一下:

v2-878de022cff8194fa6341a4b743dfbc5_1440w.jpg

从上面这张图我们可以看到,主要包含了两大部分。


第一部分:primary concerns(主要解决的问题)

(1)Authentication:身份认证/登录,验证用户是不是拥有相应的身份;

(2)Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限,比如说王者荣耀里面普通用户没有皮肤,交了钱就可以有使用会员皮肤的权限了。

(3)Session Manager:会话管理,用户登录就是一次会话,在没有退出之前,它的所有信息都在会话中;

(4)Cryptography:加密,保护数据的安全性。这个如何理解呢?平时自己学习的时候,往mysql数据库里面都是存储的用户名和密码,但是真实情况下肯定就不是这样了,只保存加密后的密码。


第二部分:支持的技术

(1)Web Support:Web支持;

(2)Caching:缓存用户的登录、角色、权限信息;

3)Concurrency:支持多线程并发验证,一个线程能把权限自动传播到另一个线程;

(3)Testing:测试支持;

(4)Run As:允许一个用户假装为另一个用户的身份进行访问;

(5)Remember Me:记住我,即一次登录后,下次再来的话不用登录了。淘宝网经常看到。


3、实现原理


上面我们知道了Shiro能干什么,这一小节主要解决的是如何做的问题。

v2-69a523a0fbafbeb85dab4e9ab1605e8e_1440w.jpg

这张图结合了外部结构和内部结构,我们认识一下里面涉及到的概念。

(1)Subject

他指代的是当前用户,比如说游客、VIP等,当然可以不是具体的人。也可以某个机器。

(2)Security Manager

他表示的是安全管理器,用户使用Shiro不同的功能,安全管理器就调用不同的模块进行管理。比如说你想要验证当前用户是否有权限登录系统。安全管理区就会调用Authenticator。在比如说你想让当前的用户可以使用那些功能,安全管理器就会调用Authrizer。

(3)Realm

realm表示数据源,比如说你要想验证用户身份是游客还是会员,realm就提前把这些用户和权限先保存了,Shiro然后调用realm里面的数据进行验证。

OK,这就是其基本原理很简单。下面我们就看一个例子,看看Shiro到底如何使用。


二、基础案例


第一步:添加jar包或者是依赖


我是在maven进行管理的,所以你只需要添加以下依赖即可

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-all</artifactId>
    <version>1.2.3</version>
</dependency>

如果你没有使用maven,那就直接在百度上搜索下列jar包导入eclipse中即可。

v2-d5b5e336aea5828ed01471d18a902b5f_1440w.jpg


第二步:在Src目录下面创建log4j.properties


这个文件是和日志相关的文件。直接复制粘贴即可

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
log4j.logger.org.apache=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.shiro=TRACE
log4j.logger.org.apache.shiro.util.ThreadContext=WARN
log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN


第三步:在src下面创建shiro.ini文件


这个文件里面保存了Shiro的各种信息,他的作用就好比是realm(暂时先这样理解)。

[users]
root = password, admin
guest = guest, guest
lisi = 123456, good
###前面是密码。后面是角色
[roles]
admin = *
good = user:delete:zhangsan
# *代表什么都可以做
# good角色可以对用户zhangsan执行delete操作


第四步:创建Test.java用户登录,开始验证


public class Test {
    private static final transient Logger log = LoggerFactory.getLogger(Test.class);
    public static void main(String[] args) {
        //第一步:从工厂中获取SecurityManager
        Factory<SecurityManager> factory =
            new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        //第二步:从SecurityUtils获取当前的Subject.
        Subject currentUser = SecurityUtils.getSubject();
        //第三步:测试使用 Session 
        Session session = currentUser.getSession();
        session.setAttribute("someKey", "aValue");
        String value = (String) session.getAttribute("someKey");
        if (value.equals("aValue")) {
            log.info("正确的value是 [" + value + "]");
        }
        //第四步:用户没有登录,则进行安全验证
        if (!currentUser.isAuthenticated()) {
            //验证1:把用户名和密码封装为UsernamePasswordToken
            UsernamePasswordToken token = new UsernamePasswordToken("lisi", "123456");
            //验证2:设置是否记录我
            token.setRememberMe(true);
            try {
                //验证3:执行登录. 
                currentUser.login(token);
            } 
            //验证4:用户登陆失败出现的异常 
            catch (UnknownAccountException uae) {
                log.info("若没有指定的账户 " + token.getPrincipal());
                return; 
            } 
            catch (IncorrectCredentialsException ice) {
                log.info("若账户存在, 但密码不匹配");
                return; 
            } 
            catch (LockedAccountException lae) {
                log.info("用户被锁定的异常");
            }
            catch (AuthenticationException ae) {
                log.info("其他的异常");
            }
        }
        //第五步:登陆成功,用户可以坐其他的事了。
        //未完。。。。。。。。。。。。。。。。。。。。。。
        //第六步:事情做完了,那就退出系统吧
        currentUser.logout();  
        System.exit(0);
    }
}

由于代码太长,我们分开来写,用户登录成功之后就可以做其他事情了

//可以做的事1:判断是否具有某个角色
if (currentUser.hasRole("admin")) {
    log.info("admin角色可以做任何事,查看任意界面");
} 
//可以做的事2:判断是否可以做某个行为 
if (currentUser.isPermitted("user:delete:zhangsan")) {
     log.info("当前用户可以执行用户zhangsan的delete方法");
}

这就是整个执行流程。我们只需要看上面的代码就能明白,不过在实际当中肯定是不会在SE中这样写的,一般都是要结合SpringBoot或者是SSM。下一篇文章,我们将直接介绍SpringBoot整合Shiro。然后对Shiro中的每一个功能,进行一个细致的介绍。如有问题还请指正。

相关文章
|
存储 缓存 安全
Shiro学习-基础入门介绍(一)
Shiro学习-基础入门介绍(一)
57 0
|
缓存 安全 算法
Shiro安全框架面试题
Shiro安全框架面试题
163 0
|
存储 算法 数据安全/隐私保护
【Shiro】第三章 Shiro入门(三)
【Shiro】第三章 Shiro入门(三)
87 1
|
存储 算法 程序员
【Shiro】第三章 Shiro入门(二)
【Shiro】第三章 Shiro入门(二)
89 1
|
安全 数据安全/隐私保护
【Shiro】第三章 Shiro入门(一)
【Shiro】第三章 Shiro入门
86 1
|
SQL 存储 缓存
Shiro安全框架简介
基本上只要涉及到用户参数的系统都要进行权限管理,使用权限管理实现了对用户访问系统的控制,不同的用户访问不同的资源。按照安全规则或者安全策略控制用户访问资源,而且只能访问被授权的资源 权限管理包括认证和授权两部分,当用户访问资源时先对其进行身份的认证,认证通过后即可访问已经授权的资源。
86 0
|
缓存 数据库 数据安全/隐私保护
【Shiro】第三章 Shiro入门(四)
【Shiro】第三章 Shiro入门(四)
93 0
|
存储 缓存 安全
java之路 —— 带你了解安全框架Shiro
java之路 —— 带你了解安全框架Shiro
129 0
|
Java 网络安全 数据库
shiro实战教程(二)
shiro实战教程(二)
244 1
shiro实战教程(二)
|
缓存 安全 前端开发
shiro架构的入门介绍
shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。 spring中有spring security (原名Acegi),是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统, 分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro。
shiro架构的入门介绍