Shiro详细介绍 springboot整合Shiro与thymleaf的简单案例

目录

1. Shiro

1.1 Shiro简介

1.2 功能

1.3 Shiro架构

2. Shiro代码讲解

2.1 ShiroConfig 配置文件

 2.2 自定义Realm

2.3 Controller中登录验证部分

3. springboot整合Shiro与thymleaf的简单案例

3.1 项目需求

3.2 配置环境

3.3 项目结构

 3.4 代码


1. Shiro

1.1 Shiro简介

  • Apache Shiro 是 Java 的一个安全(权限)框架。
  • Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。
  • 对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,所以使用小而简单的Shiro就足够了。

1.2 功能

Shiro可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JavaEE环境。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。这不就是我们想要的嘛,而且Shiro的API也是非常简单;其基本功能点如下图所示:

Authentication身份认证/登录,验证用户是不是拥有相应的身份,例如账号密码登陆;

Authorization授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;

Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;

Cryptography加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;

Web SupportWeb支持,可以非常容易的集成到Web环境;

Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;

Concurrencyshiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;

Testing提供测试支持;

Run As允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;

Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了。

记住一点,Shiro不会去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro即可。

1.3 Shiro架构

可以看到:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject;其每个API的含义:

Subject主体,应用代码直接交互的对象是 Subject,也就是说 Shiro 的对外 API 核心就是 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能得到合法的用户及其权限进行判断。

从以上也可以看出,Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。

2. Shiro代码讲解

 我们需要定义三个类来实现Shiro功能  分别是ShiroConfig, MyRealm, Controller

先导入必要包

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>

2.1 ShiroConfig 配置文件

注意:@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

import *
@Configuration
public class ShiroConfig {
    //过滤请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultSecurityManager securityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
       bean.setSecurityManager(securityManager);

        Map<String,String>map = new LinkedHashMap<>();
        map.put("/user/*","authc"); //前者指定需要加上过滤器的地址,后者指定过滤器的类型(还有许多其他类型)
        bean.setFilterChainDefinitionMap(map); //表面它可以链式编程,加上多个map.
        bean.setLoginUrl("/toLogin"); //过滤成功的跳转页面
        return bean;
    }
    //创建安全管理器
    @Bean("securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Autowired MyShiroRealm myShiroRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myShiroRealm);
        return securityManager;
    }
    //创建域
    @Bean
    public MyShiroRealm getMyShiroRealm(){
        return new MyShiroRealm(); //new 一个我自己定义的Realm
    }
}

方法getMyShiroRealm

  1. Realm:用户数据和Shiro数据交互的桥梁。比如需要用户身份认证、权限认证。都是需要通过Realm来读取数据。这里我们创建自定义的Realm并注册到Bean中。

方法getDefaultWebSecurityManager

  1. SecurityManger:SecurityManager是Shiro核心,主要协调Shiro内部的各种安全组件,只需要知道可以设置自定义的Realm,这个我们不需要太关注。

方法getShiroFilter

  1. shiro的过滤器,可以设置登录页面(setLoginUrl)、权限不足跳转(setUnauthorizedUrl)、具体某些页面的权限控制或者身份认证。

shiro中除了authoc过滤器还有许多其它的过滤器如下图

 我们可以去对应的包下找到这些过滤器

e4f9e686aaaf3f03d7df0559ca0cc7e3.png

 2.2 自定义Realm

import *
/*自定类 继承该类* */
public class MyShiroRealm extends AuthorizingRealm {

    @Override
    /*授权*/
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("执行了授权AuthorizationInfo");
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了认证AuthenticationInfo");
        return null;
    }
}

说明:

自定义的Realm类继承AuthorizingRealm类,并且重载doGetAuthorizationInfo和doGetAuthenticationInfo两个方法。

doGetAuthorizationInfo: 权限认证,即登录过后,每个身份不一定,对应的所能看的页面也不一样。

doGetAuthenticationInfo:身份认证。即登录通过账号和密码验证登陆人的身份信息。

2.3 Controller中登录验证部分

  @RequestMapping("/login")
    public String login(String username,String password,Model model){
        //从SecurityUtils获取当前的用户
        Subject subject = SecurityUtils.getSubject();
        //封装用户的登录数据形成令牌
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
      try{
            subject.login(token); //subject登录传递令牌
            return "index";
        }catch (UnknownAccountException e){
            model.addAttribute("msg","账号错误");
            return "login";
        }catch (IncorrectCredentialsException e){
            model.addAttribute("msg","密码错误");
            return "login";
        }
}

subject.login(token); 查看源码 the token encapsulating the subject's principals and credentials to be passed to the Authentication subsystem for verification 说明参数token会传递到Authentication子系统中

流程图 以账号密码登录为例

注意这里可以捕捉的异常还有很多

我们常常在 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) 函数里做一些查询数据库的数据,比较token中账号密码是否与数据库中的一致,做一些加密的操作

3. springboot整合Shiro与thymleaf的简单案例

我的页面比较简单,大家可以拿去用在自己的网页里。

3.1 项目需求

 访问/user/*实现登录拦截,登陆时要与数据库中的账号密码进行比对。

1.若没有登录,点击add跳到登录页面

2.若登录了就直接进入add页面

3.登录数据实现与数据库进行比对

4.登出

 

登陆成功访问add或update界面

3.2 配置环境

maven 3.6.1 IDEA springBoot 2.2.1 thymeleaf java 8

3.3 项目结构

 3.4 代码

https://github.com/duxuan11/SpringBoot_Shiro

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值