Spring boot整合shiro+jwt实现前后端分离

yizhihongxing

下面是“Spring Boot整合Shiro+JWT实现前后端分离”的完整攻略,包含以下步骤:

1. 添加依赖

首先要在项目的pom.xml文件中添加相关依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

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

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.4.0</version>
</dependency>

2. 添加配置文件

在项目的application.yml配置文件中添加相应的配置。

# Shiro配置
shiro:
  filter:
    anon: /login, /api/doc, /static/**
    authc: /**
  jwt:
    secret: secret
    issuer: iss
    expiration: 1800

3. 编写Realm

编写自定义Realm类,并继承org.apache.shiro.realm.AuthorizingRealm类。

public class UserRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }
}

4. 配置ShiroFilterFactoryBean

@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
    ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    shiroFilterFactoryBean.setSecurityManager(securityManager);
    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    filterChainDefinitionMap.put("/login", "anon");
    filterChainDefinitionMap.put("/api/doc", "anon");
    filterChainDefinitionMap.put("/static/**", "anon");
    filterChainDefinitionMap.put("/**", "jwt");
    shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    return shiroFilterFactoryBean;
}

5. 配置ShiroSecurityManager

@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(userRealm());
    securityManager.setSubjectFactory(servletContainerSubjectFactory());
    return securityManager;
}

@Bean
public UserRealm userRealm() {
    UserRealm userRealm = new UserRealm();
    userRealm.setCredentialsMatcher(hashedCredentialsMatcher());
    return userRealm;
}

@Bean
public ServletContainerSubjectFactory servletContainerSubjectFactory() {
    return new ServletContainerSubjectFactory();
}

@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
    HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
    hashedCredentialsMatcher.setHashAlgorithmName("SHA-256");
    hashedCredentialsMatcher.setHashIterations(1024);
    return hashedCredentialsMatcher;
}

6. 编写登录接口(示例1)

@PostMapping("/login")
public Result login(String username, String password) {
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    try {
        SecurityUtils.getSubject().login(token);
    } catch (UnknownAccountException e) {
        return Result.error("用户名不存在");
    } catch (IncorrectCredentialsException e) {
        return Result.error("密码不正确");
    } catch (AuthenticationException e) {
        return Result.error("登录失败");
    }
    String jwt = JwtUtils.createJwt(username);
    Map<String, Object> data = new HashMap<>();
    data.put("token", jwt);
    return Result.ok("登录成功", data);
}

7. 编写JWT过滤器(示例2)

public class JwtFilter extends AuthenticatingFilter {

    @Override
    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
        String jwt = JwtUtils.getJwtFromRequest((HttpServletRequest) request);
        return new JwtToken(jwt);
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        String jwt = JwtUtils.getJwtFromRequest(req);
        if (jwt == null) {
            resp.setStatus(401);
            return false;
        }
        try {
            getSubject(request, response).login(new JwtToken(jwt));
        } catch (UnknownAccountException e) {
            resp.setStatus(401);
            return false;
        }
        return true;
    }
}

完成以上步骤后,就可以通过前后端分离的方式,使用Shiro和JWT保护你的API了。

以上是Spring Boot整合Shiro+JWT实现前后端分离的完整攻略,其中包含两个示例:

  1. 编写登录接口
  2. 编写JWT过滤器

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot整合shiro+jwt实现前后端分离 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 分析Tomcat的工作原理

    分析Tomcat的工作原理 Tomcat是什么 Tomcat是一个开源的Java Servlet容器,Web服务器软件,由Apache软件基金会开发。它使得Java代码可以在Web服务器上运行,是Web应用程序的开发和部署的重要组件。 工作原理 接收请求 Tomcat通过监听指定端口,侦听客户端请求。当客户端请求到达时,Tomcat会创建一个Socket对象…

    Java 2023年5月19日
    00
  • 如何关闭 IDEA 自动更新

    下面是关于如何关闭 IDEA 自动更新的完整攻略: 1. 关闭 IDEA 自动更新 方式一:关闭自动检查更新 在 IDEA 的设置界面中,可以关闭自动检查更新功能,从而避免 IDEA 在启动时自动下载更新包。具体的操作步骤如下: 打开 IDEA,进入菜单栏,依次选择 “File” -> “Settings”(或者直接按下 “Ctrl+Alt+S” 快捷…

    Java 2023年5月26日
    00
  • java SpringSecurity使用详解

    Java Spring Security使用详解 什么是Spring Security? Spring Security是Spring框架中一个强大的安全管理框架。它提供了一个全面而灵活的安全管理机制,可以让你轻松地管理应用程序中的身份验证、授权和其他安全相关的一切。 Spring Security 的核心概念 Authentication(认证) Auth…

    Java 2023年5月19日
    00
  • Springboot使用Logback实现日志配置与异常记录

    Spring Boot使用Logback实现日志配置与异常记录 介绍 Spring Boot是一款轻量级的应用框架,它提供了很多有用的功能来简化应用开发流程,其中包括了日志记录功能。Logback是一个优秀的日志框架,它可以取代Java标准库的日志框架,并支持通过XML文件配置日志。在这篇教程中,我们将看到如何在Spring Boot应用中使用Logback…

    Java 2023年5月25日
    00
  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    下面是 “SpringBoot整合MyBatis和MyBatis-Plus的详细步骤”。 1. 添加依赖 首先,在 pom.xml 中添加以下依赖: <!– SpringBoot 整合 MyBatis 依赖 –> <dependency> <groupId>org.mybatis.spring.boot</gro…

    Java 2023年5月20日
    00
  • ajax对注册名进行验证检测是否存在于数据库中

    检测注册名是否已存在于数据库中是Web开发中常见的需求之一,而Ajax技术则常被用来实现前端异步验证。下面,我将为您讲解实现这一需求的完整攻略。 1. 前端实现 前端实现的主要流程如下: 给用户名输入框绑定事件 监听输入框的值变化,触发Ajax请求 将输入框的值作为参数发送给后端API 根据API的返回结果,展示相应的提示信息 示例代码如下: <inp…

    Java 2023年6月15日
    00
  • SpringBoot项目实现关闭数据库配置和springSecurity

    SpringBoot是一个非常流行的Java Web开发框架,它具有易用、快速开发、健壮性好等优点。在一些场景中我们需要关闭数据库配置或者关闭Spring Security,下面就具体介绍一下如何实现: 关闭数据库配置 在一些场景中,我们并不需要使用数据库,比如开发一个展示页面的网站,这时我们就可以关闭数据库配置。 步骤一:排除数据库依赖 在pom.xml文…

    Java 2023年5月20日
    00
  • 常见的Java锁有哪些?

    常见的Java锁有以下几种: 1. synchronized关键字 synchronized是Java提供的最基本的锁,可以用于方法或代码块中。它采用悲观锁的机制,在同一时间只能有一个线程获得该锁,其他线程需要等待。 示例: public class SynchronizedExample { private int count = 0; public sy…

    Java 2023年5月11日
    00
合作推广
合作推广
分享本页
返回顶部