首页 > 其他分享 >想要进行认证,授权,加密需要做的一些操作

想要进行认证,授权,加密需要做的一些操作

时间:2024-11-08 11:43:53浏览次数:3  
标签:map return 用户 认证 new 授权 login 加密

想要进行认证,授权,加密需要进行以下操作

pom.xml

需要配置的依赖

        <!-- Shiro权限管理的Thymeleaf额外功能 -->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>
        <!-- Thymeleaf布局方言,用于简化页面布局 -->
        <dependency>
            <groupId>nz.net.ultraq.thymeleaf</groupId>
            <artifactId>thymeleaf-layout-dialect</artifactId>
        </dependency>
        <!-- Apache Shiro的Spring集成 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.1</version>
        </dependency>
        <!-- Shiro的Redis缓存支持 -->
        <dependency>
            <groupId>org.crazycake</groupId>
            <artifactId>shiro-redis</artifactId>
            <version>3.1.0</version>
        </dependency>

Config配置

ShiroConfig配置信息


@Configuration
public class ShiroConfig {

    @Autowired
    ISysRightService sysRightService;

    /*** 创建ShiroDialect bean
     * ShiroDialect是用于集成Shiro和Spring的一个重要组件它作为Shiro和Spring之间的桥梁,
     * 允许在Spring的配置中使用Shiro的标签和功能这个方法通过标注@Bean来定义一个bean,
     * 使得Spring IoC容器可以管理这个bean,并将其注入到需要的地方
     * @return 新创建的ShiroDialect实例*/
    @Bean(name = "shiroDialect")
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }
    /*** 配置并创建一个Realm实例
     * 在Spring框架中,通过在方法上添加@Bean注解来声明一个Bean
     * 这个方法负责初始化并返回一个MyRealm实例,MyRealm是Realm接口的具体实现
     * @return Realm 实例,它是一个自定义的Realm,用于安全管理,如用户身份验证和授权*/
    @Bean
    public Realm realm() {
        Realm realm = new MyRealm();
        return realm;
    }

    /*** 配置并创建RedisManager bean实例
     *此方法无需外部参数,通过new操作符直接实例化RedisManager对象
     *主要作用是整合RedisManager与Spring容器,使其能被自动管理与注入
     *@return RedisManager 实例化的RedisManager对象,用于操作Redis数据存储*/
    @Bean
    public RedisManager redisManager() {
        return new RedisManager();
    }

    /*** 配置Redis缓存管理器的Bean
     * 该方法在Spring容器中创建并配置一个RedisCacheManager实例
     * @param redisManager Redis管理器,用于执行Redis缓存操作
     * @return 返回一个配置好的Redis缓存管理器实例*/
    @Bean
    public RedisCacheManager redisCacheManager(RedisManager redisManager) {
        // 创建Redis缓存管理器实例
        RedisCacheManager cacheManager = new RedisCacheManager();
        // 设置Redis管理器,用于缓存操作
        cacheManager.setRedisManager(redisManager);
        // 设置缓存中主体ID的字段名称,这里使用用户名作为主体ID
        cacheManager.setPrincipalIdFieldName("usrName");
        // 返回配置好的缓存管理器实例
        return cacheManager;
    }

    /*** 配置并创建一个DefaultWebSecurityManager实例
     * 该实例用于管理Web应用的安全,包括认证和授权
     * @param realm 自定义的Realm实现,用于与数据源交互进行身份验证和授权
     * @param redisCacheManager Redis缓存管理器,用于存储和管理安全相关的缓存数据
     * @return 返回配置好的DefaultWebSecurityManager实例*/
    @Bean
    public DefaultWebSecurityManager securityManager(Realm realm, RedisCacheManager redisCacheManager) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        securityManager.setCacheManager(redisCacheManager);
        return securityManager;
    }

    /*** 创建并配置Shiro过滤器工厂豆
     * @param securityManager 默认的Web安全管理者,是Shiro的核心安全管理对象
     * @return 返回配置好的ShiroFilterFactoryBean实例*/
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        // 初始化Shiro过滤器工厂豆
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        // 设置安全管理器
        filterFactoryBean.setSecurityManager(securityManager);
        // 设置未登录时的跳转URL
        filterFactoryBean.setLoginUrl("/index");
        // 设置未授权时的跳转URL
        filterFactoryBean.setUnauthorizedUrl("/403");
        // 创建一个有序的Map用于存放过滤规则
        Map<String, String> map = new LinkedHashMap<>();
        // 配置公共资源,这些资源不需要认证就可以访问
        map.put("/css/**", "anon");
        map.put("/fonts/**", "anon");
        map.put("/images/**", "anon");
        map.put("/js/**", "anon");
        map.put("/localcss/**", "anon");
        map.put("/localjs/**", "anon");
        map.put("/dologin", "anon");
        // 配置退出登录的URL
        map.put("/logout", "logout");
        // 从数据库中获取所有权限,并为每个权限配置相应的过滤规则
        List<SysRight> rights = sysRightService.list();
        for (SysRight right : rights) {
            // 只有当权限URL不为空时,才添加到过滤规则中
            if (right.getRightUrl() != null && !right.getRightUrl().trim().equals("")) {
                map.put(right.getRightUrl(), "perms[" + right.getRightCode() + "]");
            }
        }
        // 所有页面都要认证
        map.put("/**", "authc");
        filterFactoryBean.setFilterChainDefinitionMap(map);
        return filterFactoryBean;
    }
}

Realm配置信息

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private ISysUserService sysUserService;

    /** 授权方法
     * 该方法用于获取用户的授权信息,包括角色和权限
     * @param principalCollection 主体标识集合,用于获取用户信息
     * @return AuthorizationInfo 授权信息对象,包含用户的角色和权限*/
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        // 输出日志,表明开始授权
        System.out.println("进入了授权");
        // 获取用户信息
        SysUser sysUser = (SysUser) principalCollection.getPrimaryPrincipal();
        // 创建一个简单的授权信息对象
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        // 如果用户的角色不为空,则添加角色到授权信息中
        if (sysUser.getRole() != null) {
            info.addRole(sysUser.getRole().getRoleName());
            // 获取用户角色的权限列表
            List<SysRight> rights = sysUser.getRole().getRights();
            // 如果权限列表不为空,则遍历权限列表,添加权限到授权信息中
            if (rights != null && rights.size() > 0) {
                for (SysRight sysRight : rights) {
                    // 输出日志,显示权限代码
                    System.out.println("权限:" + sysRight.getRightCode());
                    // 添加权限到授权信息中
                    info.addStringPermission(sysRight.getRightCode());
                }
            }
        }
        // 返回授权信息对象
        return info;
    }

    /*** 认证方法
     * 该方法用于验证用户身份,通过用户名和密码检查用户是否合法
     * @param authenticationToken 认证令牌,包含用户提交的用户名和密码
     * @return AuthenticationInfo对象,包含用户信息和密码等数据
     * @throws AuthenticationException 如果认证失败,抛出此异常*/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        // 输出日志,表示进入认证流程
        System.out.println("进入了认证");
        // 将认证令牌转换为用户名密码令牌
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        // 调用sysUserService的login方法,根据用户名获取用户信息
        SysUser login = sysUserService.login(token.getUsername());
        // 如果用户信息为null,抛出认证异常,表示认证失败
        if (login == null) {
            throw new AuthenticationException("认证失败");
        }
        // 创建SimpleAuthenticationInfo对象,用于存储认证信息
        // 参数分别为:用户信息、密码、盐值、领域名称
        SimpleAuthenticationInfo info =
                new SimpleAuthenticationInfo(login, login.getUsrPassword(),
                        ByteSource.Util.bytes("mym"), getName());
        // 返回认证信息
        return info;
    }
}

测试类测试

测试类代码

@SpringBootTest
public class Shiro2ApplicationTests {

    @Autowired
    ISysUserService sysUserService;

    @Autowired
    ISysRoleService sysRoleService;


    @Test
    public void contextLoads() {
        SysUser login = sysUserService.login("admin");
        SysRole rightsByRole = sysRoleService.find(login.getUsrRoleId());
        login.setRole(rightsByRole);
        System.out.println(login.getRole());
    }
}

Controller类

controller使用代码

/** 处理用户登录请求
     * @param session HttpSession对象,用于存储用户登录信息
     * @param usrName 用户名
     * @param usrPassword 密码
     * @param model Model对象,用于传递消息
     * @return 登录成功则重定向到主页面,失败则返回登录页面*/
    @RequestMapping("/dologin")
    public String doLogin(HttpSession session, String usrName, String usrPassword, Model model) {
        try {
            // 获取当前用户主体
            Subject subject = SecurityUtils.getSubject();
            // 创建用户名和密码令牌
            UsernamePasswordToken token = new UsernamePasswordToken(usrName, usrPassword);
            // 执行登录操作
            subject.login(token);
            // 获取登录成功的用户信息
            SysUser sysUser = (SysUser) subject.getPrincipal();
            // 根据用户角色ID获取角色信息
            SysRole sysRole = sysRoleService.find(sysUser.getSysRole().getRoleId());
            // 更新用户的角色信息
            sysUser.setSysRole(sysRole);
            // 将用户信息存储到会话中
            session.setAttribute("loginUser", sysUser);
            // 登录成功,重定向到主页面
            return "redirect:/main";
        } catch (IncorrectCredentialsException e) {
            // 捕获密码错误异常
            model.addAttribute("msg", "密码错误");
        } catch (AuthenticationException e) {
            // 捕获用户认证失败异常
            model.addAttribute("msg", "用户不存在");
        }
        // 登录失败,返回登录页面
        return "login";
    }

controller里面的find方法

mapper:

mapper.xml:

resultMap:

代码如下:

<!--定义一个名为allMap的结果映射,用于将查询结果映射到SysRole类
     type属性指定了映射的目标类是com.atguigu.shiro3.pojo.SysRole-->
    <resultMap id="allMap" type="com.atguigu.shiro3.pojo.SysRole">
        <!-- 定义SysRole类中roleId属性与数据库中role_id字段的映射关系
            property属性指定SysRole类中的属性名
            column属性指定数据库查询结果集中的列名-->
        <id column="role_id" property="roleId"/>
        <!-- 定义SysRole类中sysRight属性的映射关系,该属性是一个集合,包含多个SysRight对象
            ofType属性指定了集合中元素的类型是com.atguigu.shiro3.pojo.SysRight-->
        <collection property="sysRight" ofType="com.atguigu.shiro3.pojo.SysRight">
            <!--定义SysRight类中rightCode属性与数据库中rf_right_code字段的映射关系
                同样,property属性指定SysRight类中的属性名
                column属性指定数据库查询结果集中的列名-->
            <id column="rf_right_code" property="rightCode"/>
        </collection>
    </resultMap>

service:

serviceImpl:

标签:map,return,用户,认证,new,授权,login,加密
From: https://blog.csdn.net/ou050719/article/details/143619066

相关文章

  • 【k8s安全】etcd未授权到控制k8s集群
    免责声明本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者及本公众号团队不为此承担任何责任。在安装完K8s后,默认会安装etcd组件,etcd是一个高可用的key-value数据库,它为k8s集群提供底层数据存储,保存了......
  • 鸿蒙 Next 密码管理综合案例:打造安全便捷的用户认证系统
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在数字化时代......
  • 鸿蒙 Next 企业级应用安全认证体系构建实战
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在企业级应用......
  • iOS微信授权登录中Universal Link(通用链接)的配置
    配置UnuversalLinks1.苹果开发者账号打开配置2.配置JSON文件,创建一个空白文件(必须纯文本,命名为apple-app-site-association,去除后缀名)。这里建议让后台人员在其本地创建,避免文件传输时,文件自动被更改格式、后缀自动添加等问题{"applinks":{"apps":[],......
  • Oracle OCP认证考试考点详解082系列14
    题记:本系列主要讲解OracleOCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。66.第66题:题目解析及答案:关于撤销(UNDO)和撤销表空间(UNDOTABLESPACE),以下哪两个陈述是正确的?A.一个撤销表空间可能仅由一个实例所拥有。B.撤销段由SYSBACKUP所拥有。C.撤销段由......
  • 透明无感知加密你了解吗?一篇文章,快速搞懂透明加密!
    数据已经成为企业最宝贵的资产之一。然而,随着数据泄露事件的频发,如何确保数据的安全性成为了企业面临的一大挑战。今天,我们就来聊聊一种高效、便捷且用户无感知的数据加密技术——透明无感知加密。什么是透明无感知加密?透明无感知加密,又称无感加密或自动加密技术,是一......
  • 卫星通信加密技术综述 ——选修作业
    组号:第八小组组题:卫星通信技术安全体系个人题目:卫星通信加密技术卫星通信加密技术综述引言卫星通信是利用人造卫星作为中继器来传输通信信号的方式。通过发射卫星进入地球轨道,人们可以利用卫星与全球范围内的任何地点进行通信,无需受限于地理位置的限制。(2008)黑客控制......
  • Springboot 配置yml文件 ENC 加密及failed to bind properties under '********' to j
    1.添加依赖<dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2.设置加密盐......
  • 揭秘:Java加盐加密算法,保护你的数据安全!
    加盐加密算法是一种在密码处理中广泛使用的技术,通过为密码添加一个随机值(称为“盐”)来增加密码的复杂性和安全性。下面将详细介绍加盐加密算法的概念、实现步骤以及代码示例:加盐加密算法概念加盐加密算法:通过引入随机生成的盐值与用户密码组合后进行哈希运算,以增强密码的安......
  • 一文了解USDA生物基认证的适用范围
    关于USDA生物基认证USDA生物基认证美国农业部为生物基产品提供了一个自愿认证程序。该认证证实产品含有一定比例的生物基成分,即产品中来自可再生植物、动物或海洋材料的部分,而不是来自化石燃料。 认证过程包括对产品的生物基含量进行独立的第三方验证,以及对产品的技术和环......