IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Shiro详细介绍 springboot整合Shiro与thymleaf的简单案例 -> 正文阅读

[Java知识库]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

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:17:51  更:2022-03-10 22:18:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:26:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码