Shiro安全框架

news2024/12/23 3:36:57

一、与SpringBoot整合

①:框架整合

1. 创建SpringBoot项目

环境:

  • jdk: 1.8
  • SpringBoot: 2.5.14

image.png

2. 整合MyBatis根据实体类生成表

可查看文章:https://juejin.cn/post/7234324615015776315

按照以上笔记配置后在补充一下代码

  • 依赖MyBatisPlus依赖
<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-web-starter</artifactId>
    <version>1.9.0</version>
</dependency>
  • 配置文件
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml
spring:
  datasource:
    url: jdbc:mysql://您的IP地址:3306/shirodb?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    username: root
    password: www.Coke.com
    driver-class-name: com.mysql.cj.jdbc.Driver
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
  servlet:
    multipart:
      max-file-size: 20MB
      max-request-size: 20MB
shiro:
  loginUrl: /myController/login
  registerUrl: /myController/register
  • 注意以下位置改成自己的路径

image.png

image.png

image.png

  • 启动类
@SpringBootApplication
@MapperScan("com.it.shiro_springboot.mapper")
public class Application {
    
    public static void main (String[] args) {
        SpringApplication.run(Application.class, args);
    }
    
}

image.png

②:登录认证实现

1.创建实体

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private String pwd;
    private Integer rid;
}

2.创建mapper

@Mapper
public interface UserMapper extends BaseMapper<User> {
    @Select("select * from user where name = #{name}")
    User getUserInfoByName(String name);

    @Insert("insert into user(name, pwd) values(#{name},#{pwd}) ")
    int userRegister(@Param("name") String name, @Param("pwd") String pwd);
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table (name = "user", comment = "用户表") //设置表名  注释
public class User implements Serializable {
    private static final long serialVersionUID = 9435278593475930L;
    
    @IsAutoIncrement   //自增
    @IsKey             //主键
    @Column (comment = "用户ID")//字段注释
    private Integer id;
    
    /**
     * 姓名
     */
    @Column(name = "name", comment = "用户名", length = 100)
    private String name;
    
    /**
     * 密码
     */
    @Column(name = "pwd", comment = "密码", length = 100)
    private String pwd;
    
    /**
     * 角色编号
     */
    @Column(name = "rid", comment = "角色编号", length = 100)
    private Integer rid;
}

3.创建 service

1.创建接口

public interface UserService {
    // 用户登录
    User getUserInfoByName (String name);    
    
    // 用户注册
    int userRegister(String name, String pwd);
}

2.创建实现类

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    
    @Override
    public User getUserInfoByName (String name) {
       User user = userMapper.getUserInfoByName(name);
        return user;
    }
    
    @Override
    public int userRegister (String name, String pwd) {
     // md5加密
        SimpleHash simpleHash = new SimpleHash("MD5", pwd, "salt", 3);
        return userMapper.userRegister(name, simpleHash.toHex());
    }
    
    
    
}

4.自定义realm

image.png

@Component
public class MyRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;
    
    // 自定义授权方法
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo (PrincipalCollection principalCollection) {
        return null;
    }
    // 自定义登录认证方法
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo (AuthenticationToken token) throws AuthenticationException {
        // 1.获取用户身份信息
        String name = token.getPrincipal().toString();
        // 2. 调用业务层获取用户信息(数据库中)
        User user = userService.getUserInfoByName(name);
        // 判断并将数据完成封装
        if (!ObjectUtils.isEmpty(user)) {
            SimpleAuthenticationInfo authInfo = new SimpleAuthenticationInfo(
                  token.getPrincipal(),
                  user.getPwd(),
                  ByteSource.Util.bytes("salt"),
                  token.getPrincipal().toString()
            );
            return authInfo;
        }
        return null;
    }
}

5.编写配置类

image.png

@Configuration
public class ShiroConfig {
    @Autowired
    private MyRealm myRealm;
    
    @Value("${shiro.loginUrl}")
    private String loginUrl;
    
    @Value("${shiro.registerUrl}")
    private String registerUrl;
    
    // SecurityManager
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(){
        // 1.创建 defaultWebSecurityManager 对象
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        // 2. 创建加密对象,并设置相关属性
        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        // 3.采用 md5 加密
        matcher.setHashAlgorithmName("md5");
        // 4.迭代加密次数
        matcher.setHashIterations(3);
        // 5. 将加密对象存储到 myRealm 中
        myRealm.setCredentialsMatcher(matcher);
        // 6. 将 myRealm 存入 defaultWebSecurityManager 对象
        manager.setRealm(myRealm);
        // 7. 返回
        return manager;
    }
    
    // 配置 Shiro 内置过滤器拦截范围
    @Bean
    public DefaultShiroFilterChainDefinition shiroFilterChainDefinition(){
        DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();
        // 设置不认证可以访问的资源
        definition.addPathDefinition(loginUrl, "anon");
        definition.addPathDefinition(registerUrl, "anon");
        definition.addPathDefinition("/login", "anon");
        // 设置需要进行登录认证的拦截范围
        definition.addPathDefinition("/**","authc");
        return definition;
    }
}

6.实现controller

@Controller
@Slf4j
@RequestMapping("myController")
public class MyController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("login")
    @ResponseBody
    public String userLogin(String name, String pwd){
        // 1 获取 Subject 对象
        Subject subject = SecurityUtils.getSubject();
        // 2 封装请求数据到 token 对象中
        UsernamePasswordToken token = new UsernamePasswordToken(name, pwd);
        //3 调用 login 方法进行登录认证
        try {
            subject.login(token);
            return "登录成功!";
        }catch (AuthenticationException e){
            e.printStackTrace();
            log.info("登录失败");
            return "登录失败!";
        }
        
    }
    
    @GetMapping("register")
    @ResponseBody
    public String register(String name, String pwd){
        int i = userService.userRegister(name, pwd);
        if (i > 0){
            return "注册成功!";
        }else {
            return "注册失败!";
        }
    }
}

7.测试

1.启动程序前数据库中并没有表

image.png

2.启动程序(表即可创建成功)

image.png

image.png

3.注册用户

image.png

4.登录

image.png

③:多个 realm 的认证策略设置

④:remember me 功能

⑤:用户登录认证后登出

⑥:授权、角色认证

⑤:实现缓存

⑥:会话管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1183846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML 中TextField输入框和下划线的设定

1.TextField的默认显示方式是输入框&#xff0c;如下所示: TextField { placeholderText: qsTr("Enter name") } 但是也有这样显示的,它变成了下划线: 在属性设置中是找不到相关设置&#xff0c;结果在mian.cpp中发现了一行代码会影响效果。这行代码是…

网工实验笔记:IPv6(配置6to4隧道)

1. 实验目的 熟悉6to4隧道的应用场景 掌握6to4隧道的配置方法 2. 实验拓扑 实验拓扑如图所示&#xff1a; 想要华为数通配套实验拓扑和配置笔记的朋友们点赞关注&#xff0c;评论区留下邮箱发给你! 3. 实验步骤 &#xff08;1&#xff09;配置IP地址 AR1的配置 …

ActiveMQ反序列化漏洞(CVE-2015-5254)复现

漏洞描述 Apache ActiveMQ 是由美国 Pachitea &#xff08;Apache&#xff09; 软件基金会开发的开源消息传递中间件&#xff0c;支持 Java 消息传递服务、集群、Spring 框架等。 Apache ActiveMQ 版本 5.x 之前的 5.13.0 安全漏洞&#xff0c;该漏洞由程序导致&#xff0c;不…

运动蓝牙耳机哪个品牌好?值得推荐的运动耳机分享

​对于我来说&#xff0c;运动和音乐是生活中不可或缺的元素。无论是在室内还是在户外锻炼&#xff0c;我都会选择一款适合的运动耳机&#xff0c;播放自己喜欢的音乐&#xff0c;让自己放松身心。在选择运动耳机时&#xff0c;我会考虑到它的舒适度、音质、耐用的性能以及防水…

led灯对眼睛有伤害吗?精选高品质的护眼台灯

在大家的认知中led灯最大的危害就是有蓝光辐射&#xff0c;其实在如今科技发达的时代&#xff0c;很多led灯对蓝光的处理技术都已经非常成熟的了&#xff0c;有些led灯具甚至做到了RG0无蓝光危害的。只要我们挑选一款光源合适、质量合格的产品&#xff0c;正确的使用基本都不会…

Kubernetes的介绍

目录 Kubernetes概述 1、作用 2、官网 3、K8S的主要功能 Kubernetes 集群架构与组件 1、核心组件 1&#xff09;Kube-apiserver 2&#xff09;Kube-controller-manager 3&#xff09;Kube-scheduler 4&#xff09;etcd 5&#xff09;Kubelet 6&#xff09;Kube-Pro…

FAN7391MX 高压600V 用于高压、高速驱动 MOSFET和IGBT 半桥栅极驱动器IC

FAN7391MX是单片高侧和低侧栅极驱动 IC&#xff0c;可驱动工作在高达 600 V 电压的高速 MOSFET 和 IGBT。它具有缓冲输出级&#xff0c;所有 NMOS 晶体管设计用于实现高脉冲电流驱动能力和最低交叉传导。Fairchild 的高压工艺和共模噪声消除技术可使高侧驱动器在高 dv/dt 噪声环…

amd Ubuntu opencl 安装

amd cpugpu 安装amd显卡驱动&#xff0c;下载地址&#xff1a; https://www.amd.com/en/support/linux-drivers //eg: sudo apt install ./amdgpu-install_5.4.50403-1_all.deb amdgpu-install安装成功之后可输入 glxinfo | grep rendering&#xff0c;显示 yes 则显卡驱动安…

浙江大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;主页 | 教育漏洞报告平台 兑换价格&#xff1a;20金币 获取条件&#xff1a;提交浙江大学任意中危或以上级别漏洞

财务自由纲领

一、大道至简 抓住事物的要害和根本&#xff0c;剔除那些无效的、非本质的东西&#xff0c;化繁为简 二、空杯心态 空杯心态象征意义是做事的前提是先要有好心态。如果想学到更多学问&#xff0c;先要把自己想象成“一个空着的杯子”&#xff0c;而不是骄傲自满。有一句话说&a…

【更新公告】AirtestIDE更新至1.2.16版本

1. 前言 本次更新为AirtestIDE、Airtest、Poco更新。 AirtestIDE更新至1.2.16版本&#xff0c;Airtest更新为1.3.1版本&#xff0c;Poco更新为1.0.92版本&#xff0c;主要为iOS内容更新、新增Android剪切板功能、poco问题修复等。更多更新内容详见下文。 2. 更新内容 1&…

易基因:cfDNA甲基化诊断和监测肿瘤的研究进展与展望:胰腺癌|深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 胰腺癌因其病死率高而成为目前最具挑战性的恶性肿瘤之一。考虑到目前的治疗方案诊断较晚&#xff0c;生存获益有限&#xff0c;优化早期检测、预后和治疗反应预测势在必行。近年来大量研…

Git设置显示中文

git config --global i18n.comitencoding utf-8 git config --global i18n.logoutputencoding utf-8 export LESSCHARSETutf-8

不会平面设计软件,如何做好一本精美的产品画册?

想要制作一本优秀精美的产品画册&#xff0c;还是有一定难度的&#xff0c;一本好的产品画册不仅需要好的内容&#xff0c;同时也需要一个美观、方便阅读的呈现形式。 那很多人都会问&#xff0c;这么多要求的产品画册&#xff0c;像我这种不会平面设计软件的&#xff0c;要如…

Promise链式调用改写成async/await

首先&#xff0c;Promise链式调用和async/await都是用来解决异步调用层层嵌套的问题。 promise解决了回调地狱的问题&#xff0c;把异步任务完成后的处理函数换个位置放&#xff1a;传给then方法&#xff0c;并支持链式调用&#xff0c;避免层层回调。用catch方法捕获错误。 …

sd-wan专线异地组网|分支机构与总部间外贸MES系统高速访问解决方案

随着全球化的快速发展&#xff0c;国际市场对于企业的重要性日益增加&#xff0c;很多外贸企业都会选择在海外建立工厂&#xff0c;以求更好的发展国际市场&#xff0c;但是&#xff0c;海外建立工厂必然会在当地招聘新的公司人员&#xff0c;如何做好异地管理和监控海外工厂的…

培训心得怎么写?CHAT帮你解决问题

问CHAT&#xff1a;请写一篇入职教师的培训心得 CHAT回复&#xff1a;作为一名新入职的教师&#xff0c;我非常感谢学校给予的这次培训机会。此次培训让我收获颇丰&#xff0c;无论是在教学理念、教学技巧上&#xff0c;还是在如何与学生、家长建立良好关系方面&#xff0c;都有…

【高分快刊】Elsevier旗下,中科院2区SCI,2个月19天录用!

计算机类 • 高分快刊解读 今天小编带来Elsevier旗下计算机领域好刊的解读&#xff0c;如有相关领域作者有意向投稿&#xff0c;可作为重点关注&#xff01;后文有真实发表案例&#xff0c;供您投稿参考~ 01 期刊简介 ☑️出版社&#xff1a;Elsevier ☑️影响因子&#xf…

双11观察:给用户的越多,用户给予的更多

这几年&#xff0c;双11风向倏然转变。 一个明显趋势在于&#xff0c;各大平台商家不再唯销量论&#xff0c;转而更关注消费者。今年&#xff0c;天猫提出要“办一届快乐的天猫双11&#xff0c;让用户开心地来、快乐地逛”&#xff1b;京东也联合了全国超40万实体门店&#xf…

【MySQL】嵌套查询—数据之旅:解析层层嵌套的迷思

&#x1f38a;专栏【MySQL】 &#x1f33a;每日一句&#xff1a;宝剑锋从磨砺出,梅花香自苦寒来 ⭐欢迎并且感谢大家指出我的问题 文章目录 嵌套查询 (1)不相关子查询(带有IN谓词的子查询) &#x1f354;定义 &#x1f354;使用说明 &#x1f354;特点 &#x1f354;实际…