当前位置: 首页 > 编程笔记 >

Springboot整合Shiro的代码实例

乐钱青
2023-03-14
本文向大家介绍Springboot整合Shiro的代码实例,包括了Springboot整合Shiro的代码实例的使用技巧和注意事项,需要的朋友参考一下

这篇文章主要介绍了Springboot整合Shiro的代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、导入依赖

<!--shiro-->
<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-spring</artifactId>
  <version>1.4.0</version>
</dependency>

2、创建ShiroRealm.java文件

(这里按照需求,只做登录认证这块)

package com.hyqfx.manager.shiro;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.hyqfx.manager.entity.po.SystemAdmin;
import com.hyqfx.manager.service.ISystemAdminService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;

public class ShiroRealm extends AuthorizingRealm {

  @Autowired
  private ISystemAdminService adminService;

  //授权
  @Override
  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    /*
    //获取登录用户名
    String name= (String) principalCollection.getPrimaryPrincipal();
    //查询用户名称
    User user = loginService.findByName(name);
    //添加角色和权限
    SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
    for (Role role:user.getRoles()) {
      //添加角色
      simpleAuthorizationInfo.addRole(role.getRoleName());
      for (Permission permission:role.getPermissions()) {
        //添加权限
        simpleAuthorizationInfo.addStringPermission(permission.getPermission());
      }
    }
    return simpleAuthorizationInfo;*/


    return null;
  }

  //认证
  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    //加这一步的目的是在Post请求的时候会先进认证,然后在到请求
    if (authenticationToken.getPrincipal() == null) {
      return null;
    }
    //获取用户信息
    String name = authenticationToken.getPrincipal().toString(); 
    SystemAdmin admin = adminService.selectOne(new EntityWrapper<SystemAdmin>().eq("username",name));

    if (admin == null) {
      return null;
    } else {
      //这里验证authenticationToken和simpleAuthenticationInfo的信息
      SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(name, admin.getPassword().toString(), getName());
      return simpleAuthenticationInfo;
    }
  }
}

3、创建ShiroConfiguration.java文件

package com.becl.config;

import com.becl.shiro.PasswordMatcher;
import com.becl.shiro.ShiroRealm;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

@Configuration
public class ShiroConfiguration {



  //将自己的验证方式加入容器
  @Bean
  public ShiroRealm myShiroRealm() {
    ShiroRealm myShiroRealm = new ShiroRealm();
    myShiroRealm.setCredentialsMatcher(passwordMatcher());//装配自定义的密码验证方式
    return myShiroRealm;
  }

  // 配置加密方式
  // 配置了一下,这货就是验证不过,,改成手动验证算了,以后换加密方式也方便
  @Bean
  public PasswordMatcher passwordMatcher() {
    return new PasswordMatcher();
  }

  //权限管理,配置主要是Realm的管理认证
  @Bean
  public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(myShiroRealm());
    return securityManager;
  }

  //Filter工厂,设置对应的过滤条件和跳转条件
  @Bean
  public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    shiroFilterFactoryBean.setSecurityManager(securityManager);
    Map<String,String> map = new HashMap<String, String>();
    //登出
    map.put("/logout","logout");
    //不需要认证
    map.put("/logout","anon");
    map.put("/login*","anon");
    map.put("/shiroError","anon");
    //对所有用户认证
    map.put("/**","authc");
    //map.put("/**","anon");
    //登录
    shiroFilterFactoryBean.setLoginUrl("/login");
    //首页
    shiroFilterFactoryBean.setSuccessUrl("/index");
    //错误页面,认证不通过跳转
    shiroFilterFactoryBean.setUnauthorizedUrl("/shiroError");
    shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    return shiroFilterFactoryBean;
  }

  //加入注解的使用,不加入这个注解不生效
  @Bean
  public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
  }

}

4、自定义Shiro的密码比较器

package com.becl.shiro;

import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authc.credential.SimpleCredentialsMatcher;
import org.mindrot.jbcrypt.BCrypt;

/**
 * 自定义密码比较器
 */
public class PasswordMatcher extends SimpleCredentialsMatcher {

  @Override
  public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
    UsernamePasswordToken utoken=(UsernamePasswordToken) token;

    //获得用户输入的密码:(可以采用加盐(salt)的方式去检验)
    String inPassword = new String(utoken.getPassword());
    String username = utoken.getUsername();

    //获得数据库中的密码
    String dbPassword = (String) info.getCredentials();
    //进行密码的比对
    boolean flag = BCrypt.checkpw(inPassword,dbPassword);
    return flag;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍SpringBoot整合Shiro的代码详解,包括了SpringBoot整合Shiro的代码详解的使用技巧和注意事项,需要的朋友参考一下 shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/  它提供了很方便的权限认证和登录的功能.   而springboot作为一个开源框架,必然提供了和shiro整合的功能!接下来就用springbo

  • 本文向大家介绍SpringBoot中整合Shiro实现权限管理的示例代码,包括了SpringBoot中整合Shiro实现权限管理的示例代码的使用技巧和注意事项,需要的朋友参考一下 之前在 SSM 项目中使用过 shiro,发现 shiro 的权限管理做的真不错,但是在 SSM 项目中的配置太繁杂了,于是这次在 SpringBoot 中使用了 shiro,下面一起看看吧 一、简介 Apache Sh

  • 本文向大家介绍springboot整合 beatlsql的实例代码,包括了springboot整合 beatlsql的实例代码的使用技巧和注意事项,需要的朋友参考一下 BeetSql是一个全功能DAO工具, 同时具有hibernate 优点 & Mybatis优点功能,适用于承认以SQL为中心,同时又需求工具能自动能生成大量常用的SQL的应用。 beatlsql 优点 开发效率 无需注解,自动使用

  • 本文向大家介绍SpringBoot整合Swagger2代码实例,包括了SpringBoot整合Swagger2代码实例的使用技巧和注意事项,需要的朋友参考一下 首先遵循SpringBoot的三板斧 第一步添加依赖 第二步添加注解 @EnableSwagger2 //启动SwaggerUI,在启动类或Swagger配置类上添加该注解 第三步写配置 扩展:swagger-bootstrap-ui是sp

  • 本文向大家介绍springboot整合httpClient代码实例,包括了springboot整合httpClient代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了springboot整合httpClient代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建httpClientConfig配置类 创建HttpCli

  • 本文向大家介绍springboot 整合 freemarker代码实例,包括了springboot 整合 freemarker代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了springboot 整合 freemarker代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 依赖 application.yml applic