spring boot整合Shiro实现单点登录的示例代码

下面是关于“spring boot整合Shiro实现单点登录的示例代码”的详细攻略。

环境准备

首先,我们需要准备以下环境:

  • JDK 8
  • Maven
  • IDE:Eclipse 或者 Intellij IDEA

在环境准备完成后,我们接下来需要进行以下的准备工作。

创建Spring Boot工程

我们可以通过Maven快速构建一个Spring Boot应用程序,然后加上Shiro依赖即可。

  1. 打开Eclipse或者Intellij IDEA,创建一个普通的Maven工程;
  2. 在pom.xml文件中添加以下的Spring Boot依赖:
<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.4.0</version>
</dependency>
  1. 执行命令 mvn clean install 完成依赖的下载

Shiro基本配置

接下来,我们需要进行Shiro的基本配置

  1. 创建ShiroConfig类

在src/main/java下创建一个ShiroConfig类

@Configuration
public class ShiroConfig {
    /**
     * 配置Shiro到Spring容器
     * @param securityManager
     * @return
     */
    @Bean(name = "shiroFilter")
    protected ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //声明securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //注册authcFilter过滤器
        Map<String, Filter> filters = new LinkedHashMap<>();
        filters.put("authc", authcFilter());
        shiroFilterFactoryBean.setFilters(filters);

        //为URL设置访问所需要的角色
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/login", "authc");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        shiroFilterFactoryBean.setLoginUrl("/login");

        return shiroFilterFactoryBean;
    }

    /**
     * 创建securityManager
     *
     * @return
     */
    @Bean(name = "securityManager")
    protected DefaultWebSecurityManager defaultWebSecurityManager(UserRealm bean) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //注入Realm
        securityManager.setRealm(bean);
        return securityManager;
    }

    /**
     * 创建Realm
     *
     * @return
     */
    @Bean(name = "realm")
    public UserRealm userRealm() {
        return new UserRealm();
    }

    /**
     * 注册authcFilter过滤器
     * @return
     */
    @Bean(name = "authc")
    public AuthenticationFilter authcFilter() {
        UsernamePasswordAuthenticationFilter authcFilter = new UsernamePasswordAuthenticationFilter();
        authcFilter.setLoginUrl("/login");
        return authcFilter;
    }
}
  1. 创建一个UserRealm类

在src/main/java下创建一个UserRealm类:

public class UserRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;

    /**
     * 授权
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        User user = (User) principalCollection.getPrimaryPrincipal();

        //获取角色ResouceCode关联信息
        List<ResouceCode> resouceCodeList = userService.selectResourceCodeList(user.getUserName());
        //将role和url加入到授权对象中
        if (resouceCodeList != null && resouceCodeList.size() > 0) {
            for (ResouceCode resouceCode : resouceCodeList) {
                authorizationInfo.addRole(resouceCode.getRoleCode().toUpperCase());
                authorizationInfo.addStringPermission(resouceCode.getResCode().toLowerCase());
            }
        }

        return authorizationInfo;
    }

    /**
     * 验证 登录
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
        String username = usernamePasswordToken.getUsername();
        if (StringUtils.isBlank(username)) {
            return null;
        }

        User user = userService.selectUserByUserName(username);
        if (user == null) {
            return null;
        }
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getCredentialsSalt()), getName());

        return authenticationInfo;
    }
}

编写Controller和View

接下来,我们需要编写Controller和View

  1. 添加登录页面

在src/main/resources下创建login.html页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登陆</title>
</head>
<body>
<div>
<form method="post" th:action="@{/login}">
<div>
<label>用户名: <input type="text" name="username" required></label>
</div>
<div>
<label>密码: <input type="password" name="password" required></label>
</div>
<div><input type="submit" value="登陆"></div>
</form>
</div>
</body>
</html>
  1. 创建HomeController类

在src/main/java下创建一个HomeController类,实现登录成功后的跳转:

@Controller
public class HomeController {

    /**
     * 登录成功后跳转到主页面
     *
     * @return
     */
    @RequestMapping("/home")
    public String home() {
        return "/views/home";
    }
}
  1. 创建IndexController类

在src/main/java下创建一个IndexController类,实现登录和退出:

@Controller
public class IndexController {

    /**
     * 登录
     *
     * @return
     */
    @RequestMapping("/login")
    public String login() {
        return "/views/login";
    }

    /**
     * 退出
     *
     * @return
     */
    @RequestMapping("/logout")
    public String logout() {
        SecurityUtils.getSubject().logout();
        return "redirect:/login";
    }
}
  1. 创建Home页面

在src/main/resources/views下创建一个home.html页面,实现登录验证后的统一页面:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>首页</title>
</head>
<body>
<h1>欢迎访问首页</h1>
</body>
</html>

两个示例说明

下面我们演示两个Shiro单点登录的应用:

示例一:普通登录

  1. 在浏览器中输入网址 http://localhost:8080/login,会跳转到登录页面;
  2. 在登录页面中输入用户名和密码,点击“登陆”,会跳转到应用的首页:http://localhost:8080/home,同时在请求头中设置了Cookie;
  3. 访问 http://localhost:8080/home,会发现并没有被拦截,说明登录成功;

示例二:多个应用的单点登录

假设有两个应用APP1和APP2,在浏览器中访问APP1,然后跳转到APP2,由于已经实现了Shiro单点登录,所以在访问APP2时,就无需再次输入用户名和密码。

  1. 访问APP1,执行登录操作,成功登录;
  2. 在APP1的页面上添加访问APP2页面的链接,并设置URL为APP2的登录页面URL;
  3. 点击APP2的链接,跳转到APP2的登录页面,此时我们并不需要再次输入用户名和密码;
  4. 点击APP2的首页链接,会发现并没有被拦截,说明登录成功。

总结

至此,我们已经完成了Spring Boot整合Shiro实现单点登录的示例代码。需要注意的是,这里的示例是最基本的示例,如果想要在实际应用中使用,还需要根据实际情况进行具体的配置和开发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot整合Shiro实现单点登录的示例代码 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 深入解析Java的Spring框架中的混合事务与bean的区分

    深入解析Java的Spring框架中的混合事务与bean的区分,这是一个比较广泛的话题,我们可以从以下几个方面进行讲解: Spring框架事务管理的概述 Spring混合事务的定义与原理 Spring Bean的定义与作用 如何区分Spring混合事务与Bean 1. Spring框架事务管理的概述 Spring框架中的事务管理是一种重要的机制,可以帮助我们…

    Java 2023年5月20日
    00
  • spring mvc 组合mybatis框架实例详解

    Spring MVC 搭配 MyBatis 框架实例详解 本文将针对如何使用 Spring MVC 框架搭配 MyBatis 框架展开讲解,包括环境搭建、配置,以及搭建一个简单的增删改查示例。 环境搭建 为了使用 Spring MVC 搭配 MyBatis 框架,我们需要先完成以下环境的搭建: JDK:需要 JDK 版本为 1.8 或以上; Maven:使用…

    Java 2023年6月16日
    00
  • 新欢乐时光代码分析

    下面为您详细讲解“新欢乐时光代码分析”的完整攻略。 新欢乐时光代码分析完整攻略 什么是新欢乐时光 新欢乐时光是一款在线编程学习网站,提供基于计算机科学和编程方面的在线培训课程。它的使命是通过免费、灵活、高质量的教育资源,为全球的学生和教育者带来变革性的教育体验。 在线代码分析工具使用教程 新欢乐时光提供了一款在线代码分析工具,允许用户输入自己的代码,然后自动…

    Java 2023年6月15日
    00
  • 详解Java数组的四种拷贝方式

    下面是详解Java数组的四种拷贝方式: 概述 在Java中,我们可以使用多种方式对数组进行拷贝。这些拷贝方式包括:1. for循环2. System.arraycopy()方法3. Arrays.copyOf()方法4. clone()方法 本文将详细介绍这四种方式,并提供示例演示它们的使用方法和区别。 for循环 使用for循环拷贝数组是最基本和最常用的方…

    Java 2023年5月26日
    00
  • SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解

    SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解 在 Spring Boot 应用程序中,我们可以使用 @ConditionalOnXXX 注解来控制自动配置是否生效。例如,@ConditionalOnClass 注解可以在 classpath 中存在指定的类时生效,@ConditionalOnMissingBean 注解…

    Java 2023年5月15日
    00
  • Spring Security使用数据库登录认证授权

    接下来我将为你讲解“Spring Security使用数据库登录认证授权”的完整攻略。 1. 概述 Spring Security是用于保护Spring应用程序的安全框架,它提供了包括身份验证、授权、攻击防御等在内的一系列安全特性。本文将介绍如何使用Spring Security对数据库进行登录认证授权。 2. 前置条件 本文假设你已经熟悉Spring Bo…

    Java 2023年5月20日
    00
  • Spring MVC简介_动力节点Java学院整理

    Spring MVC简介 Spring MVC是一种基于Java的轻量级Web框架,用于开发Web应用程序。它基于MVC(模型-视图-控制器)设计模式,该模式将应用程序分为三个主要组成部分,以提供松散耦合的应用程序开发。Spring MVC还提供了中央调度,以便将控制器(Controller)与用户界面(View)分开。 Spring MVC架构 Sprin…

    Java 2023年5月31日
    00
  • java基础的详细了解第七天

    Java基础的详细了解第七天攻略 在第七天的学习中,我们将了解Java的异常处理机制。异常是指程序运行期间发生的不正常情况,如除数为0,数组越界等等。在Java中,异常处理机制提供了异常的捕获、处理和抛出的操作,可以帮助我们提高程序的健壮性。 异常类的层次结构 在Java中,异常类是按照树形结构进行组织的,最顶层是Throwable类,下面分为两个子类,分别…

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