栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Shiro

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Shiro

1、Shiro简介

2、springboot集成Shiro (1)、导入themleaf依赖

            org.thymeleaf
            thymeleaf-spring5
        
        
            org.thymeleaf.extras
            thymeleaf-extras-java8time
        
(2)、导入shiro整合springboot的包

            org.apache.shiro
            shiro-spring
            1.9.0
        
(3)、Shiro实现登陆拦截 1)、自定义后端响应
package com.example.shirospringboot.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    @RequestMapping({"/", "/index"})
    public String index(Model model) {
        model.addAttribute("msg","ml");
        return "index";
    }

    @RequestMapping("/add")
    public String add() {
        return "user/add";
    }

    @RequestMapping("/update")
    public String update() {
        return "user/update";
    }

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }
}

2)、核心配置文件javaConfig

首先必须要在config目录下定义一个UserRealm类

package com.example.shirospringboot.config;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

//自定义的UserRealm extends AuthorizingRealm
public class UserRealm extends AuthorizingRealm {
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权");
        return null;
    }

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

然后将前面定义好的 UserRealm注册到容器中交给springboot托管,config目录下的ShiroConfig.java文件如下

package com.example.shirospringboot.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {


//1、创建Realm对象,需要自定义类,将定义好的UserRealm注册到容器中交给springboot托管
@Bean
public UserRealm userRealm() {
    return new UserRealm();
}


    //2、DefaultWebSecurityManager
    @Bean("defaultWebSecurityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联Realm对象
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //3、ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加Shiro的内置过滤器
        
        Map filrterMap = new LinkedHashMap<>();
        filrterMap.put("/add", "authc");
        filrterMap.put("/update", "authc");
        bean.setFilterChainDefinitionMap(filrterMap);
        //设置登陆的请求,只有登陆之后才可以访问
        bean.setLoginUrl("/toLogin");
        return bean;
    }
}

登陆演示,点击添加页面或者更新页面发现被拦截了

被拦截之后路由跳转到登陆页面

只有认证登陆之后才能访问刚才点击的“更新页面”或者“添加页面”,拦截成功!
登陆拦截代码分析
//1、创建Realm对象,需要自定义类,将定义好的UserRealm注册到容器中交给springboot托管
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }

这段代码是将自定义好的UserRealm类注册到容器中让spring托管

 //2、DefaultWebSecurityManager
    @Bean("defaultWebSecurityManager")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联Realm对象
        securityManager.setRealm(userRealm);
        return securityManager;
    }

//点开源码了可以看到,DefaultWebSecurityManager管理的类很多,不止是前面自定义好的一个
public DefaultWebSecurityManager(Realm singleRealm) {
        this();
        this.setRealm(singleRealm);
    }

    public DefaultWebSecurityManager(Collection realms) {
        this();
        this.setRealms(realms);
    }

这段代码是让DefaultWebSecurityManager管理前面我们自己定义好的UserRealml类;点开源码了可以看到,DefaultWebSecurityManager管理的类很多,不止是前面自定义好的一个。将DefaultWebSecurityManager注册到spring容器中

 //3、ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加Shiro的内置过滤器
        
        Map filrterMap = new LinkedHashMap<>();
        filrterMap.put("/add", "authc");
        filrterMap.put("/update", "authc");
        bean.setFilterChainDefinitionMap(filrterMap);
        //设置登陆的请求,只有登陆之后才可以访问
        bean.setLoginUrl("/toLogin");
        return bean;
    }

这段代码是实现拦截的根本代码。filrterMap.put("/add", "authc"); filrterMap.put("/update", "authc");设置拦截的规则,只有这两个路由会被拦截,没有使用filrterMap.put的不会被拦截。拦截之后会走向我们自己定义好的登陆认证页面,没有登陆认证是不可能访问到想要的页面的。但是我们需要注意的是在Shiro中没有提前定义好的登陆页面供我们使用,这个拦截之后的登陆页面必须我们自己写!这个和springSecurity是不同的。然后将ShiroFilterFactoryBean注册到spring中供我们使用!

(4)、Shiro实现用户认证
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号