springmvc集成shiro登录失败处理操作

要将SpringMVC和Shiro集成起来,需要进行以下步骤:

1. 导入相关依赖

在项目的pom.xml文件中,需要添加spring-boot-starter-web、shiro-spring、shiro-core和thymeleaf等相关依赖。具体依赖版本可以自行选择,这里我给出一个示例:

<dependencies>
  <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.6.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.6.0</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
</dependencies>

2. 配置Shiro和SpringMVC

在Spring Boot应用程序中,可以在application.properties文件中配置Shiro和SpringMVC:

# Shiro配置
shiro.loginUrl = /login
shiro.successUrl = /index
shiro.unauthorizedUrl = /unauthorized

# SpringMVC配置
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.html

3. 编写Shiro配置类

Shiro的配置需要一个ShiroConfig类,通常继承自ShiroWebMvcConfigurerAdapter,这样可以将Shiro拦截器和SpringMVC的拦截器进行集成。

@Configuration
public class ShiroConfig {
  @Autowired
  private Environment env;

  @Bean
  public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
    ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
    shiroFilter.setSecurityManager(securityManager);

    shiroFilter.setLoginUrl(env.getProperty("shiro.loginUrl"));
    shiroFilter.setUnauthorizedUrl(env.getProperty("shiro.unauthorizedUrl"));

    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

    filterChainDefinitionMap.put("/static/**", "anon");
    filterChainDefinitionMap.put("/logout", "logout");
    filterChainDefinitionMap.put("/**", "authc");

    shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
    return shiroFilter;
  }

  @Bean
  public DefaultWebSecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(shiroRealm());
    return securityManager;
  }

  @Bean
  public ShiroRealm shiroRealm() {
    ShiroRealm shiroRealm = new ShiroRealm();
    return shiroRealm;
  }

  @Bean
  public ShiroDialect shiroDialect() {
    return new ShiroDialect();
  }
}

4. 编写ShiroRealm类

ShiroRealm是实现Shiro用户身份验证和授权的核心,需要继承AuthorizingRealm类,实现doGetAuthenticationInfo和doGetAuthorizationInfo方法。

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

  @Override
  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    // 授权
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    User user = (User) principals.getPrimaryPrincipal();
    authorizationInfo.setRoles(userService.getUserRoles(user.getUsername()));
    authorizationInfo.setStringPermissions(userService.getUserPermissions(user.getUsername()));
    return authorizationInfo;
  }

  @Override
  protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    // 身份验证
    UsernamePasswordToken upToken = (UsernamePasswordToken) token;
    String username = upToken.getUsername();
    User user = userService.getUserByUsername(username);
    if (user == null) {
      throw new UnknownAccountException("用户不存在!");
    }
    return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
  }
}

5. 编写用户服务类

用户服务类是指封装用户信息并提供相关服务的类,这里我假设UserService类已经完成并可用。

6. 编写登录控制器

登录控制器负责处理用户登录请求和跳转,登录表单也应该在此处处理。成功或失败后需要处理相应的逻辑。

@Controller
public class LoginController {

  @RequestMapping("/login")
  public String login(HttpServletRequest request) {
    String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
    String error = null;
    if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
      error = "用户名/密码错误";
    } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
      error = "用户名/密码错误";
    } else if (AuthenticationException.class.getName().equals(exceptionClassName)) {
      error = "无效的用户名/密码";
    } else if (exceptionClassName != null) {
      error = "其他错误:" + exceptionClassName;
    }
    request.setAttribute("error", error);

    return "login";
  }

  @RequestMapping("/")
  public String index() {
    return "index";
  }

  @RequestMapping("/unauthorized")
  public String unauthorized() {
    return "unauthorized";
  }

  @RequestMapping("/logout")
  public String logout() {
    Subject subject = SecurityUtils.getSubject();
    if (subject != null) {
      subject.logout();
    }
    return "redirect:/login";
  }
}

以上就是SpringMVC集成Shiro登录失败处理的完整攻略,具体过程还需要根据项目实际情况进行调整。以下是两个示例:

示例一:登录失败后跳转到同一页面,并提示错误信息

需要在控制器方法中添加shiroLoginFailure属性,并根据登录验证不通过的情况进行错误信息的提示:

@RequestMapping("/login")
public String login(HttpServletRequest request) {
  String exceptionClassName = (String) request.getAttribute("shiroLoginFailure");
  String error = null;
  if (UnknownAccountException.class.getName().equals(exceptionClassName)) {
    error = "用户名/密码错误";
  } else if (IncorrectCredentialsException.class.getName().equals(exceptionClassName)) {
    error = "用户名/密码错误";
  } else if (AuthenticationException.class.getName().equals(exceptionClassName)) {
    error = "无效的用户名/密码";
  } else if (exceptionClassName != null) {
    error = "其他错误:" + exceptionClassName;
  }
  request.setAttribute("error", error);

  return "login";
}

这样,在登录验证不通过的情况下,会自动跳转回登录页面,并提示相应的错误信息。

示例二:登录失败后跳转到不同页面,并提示错误信息

在控制器中添加ShiroFilterFactoryBean的unauthorizedUrl属性,将其指向不允许访问的页面即可。这样,在用户登录验证不通过或者没有权限的时候,会跳转到指定的页面。

@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
  ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
  shiroFilter.setSecurityManager(securityManager);

  shiroFilter.setLoginUrl(env.getProperty("shiro.loginUrl"));
  shiroFilter.setUnauthorizedUrl(env.getProperty("shiro.unauthorizedUrl"));

  Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

  filterChainDefinitionMap.put("/static/**", "anon");
  filterChainDefinitionMap.put("/logout", "logout");
  filterChainDefinitionMap.put("/admin", "roles[admin]");
  filterChainDefinitionMap.put("/**", "authc");

  shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);
  return shiroFilter;
}

@RequestMapping("/unauthorized")
public String unauthorized() {
  return "unauthorized";
}

这样,在用户访问不允许访问的页面时,会自动跳转到unauthorized页面,并提示相应的错误信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc集成shiro登录失败处理操作 - Python技术站

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

相关文章

  • java基础之NIO介绍及使用

    下面是 “Java基础之NIO介绍及使用” 的详细攻略: 什么是NIO NIO,全称为 Non-blocking I/O,是一个Java IO操作的一种实现方式。与传统的I/O操作相比,NIO可以提供更高效的处理能力和更强的可扩展性。NIO的主要特点是以缓冲区为基础,通过通道进行数据操作和传输,支持非阻塞模式,提供了 Selector 选择器等一些高级的特性…

    Java 2023年5月24日
    00
  • java xml转为json的n种方法

    Java中将XML转换为JSON的方法有很多。本文将详细介绍不同的方法及其使用方式。 方法一:使用Java相关的库 Java中有很多开源的库可用于将XML转换为JSON。其中常用的有以下几种: Jackson Jackson是一个主要用于处理JSON,但也支持XML的Java库。它提供一个简单的方法,可以将XML文件转换为JSON格式。 java Objec…

    Java 2023年5月26日
    00
  • java自定义实现base64编码转换

    下面是详细讲解“java自定义实现base64编码转换”的完整攻略,包含示例: 1. 什么是Base64编码 Base64编码是一种将二进制数据转换为可打印字符的编码方式,通常用于网络传输或文本文件中嵌入二进制数据。Base64编码的特点是编码后的数据长度通常会比原始数据增加三分之一左右。 2. 实现自定义的Java Base64编码转换 Java提供了ja…

    Java 2023年5月20日
    00
  • IDEA多线程文件下载插件开发的步骤详解

    下面我会为你详细讲解“IDEA多线程文件下载插件开发的步骤详解”的完整攻略。整个过程将包含以下几个步骤: 确定要实现的功能 新建一个IntelliJ IDEA插件项目 编写代码,完成下载文件的功能 安装和调试插件 将插件打包发布 下面对每个步骤进行详细说明: 1. 确定要实现的功能 在开发插件之前,我们需要确定插件要实现的功能和使用场景。本篇攻略实现的功能是…

    Java 2023年5月26日
    00
  • 搭建MyBatis开发环境及基本的CURD介绍

    关于搭建MyBatis开发环境以及基本的CURD介绍,我们需要以下几步: 安装 Java SE环境 首先需要在本地安装好Java SE环境,通常使用官网提供的JDK安装包进行安装,安装完毕之后可以使用 java -version 命令查看安装是否成功。 安装和配置 Maven Maven是一个Java项目管理工具,可以方便地管理Java项目中的依赖关系和构建…

    Java 2023年6月2日
    00
  • springboot配置templates直接访问的实现

    下面是springboot配置templates直接访问的实现攻略: 1、添加Maven依赖 在pom.xml文件中添加以下Maven依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-star…

    Java 2023年5月19日
    00
  • spring boot 结合jsp案例详解

    下面我来详细讲解“Spring Boot 结合 JSP 案例详解”的完整攻略。 一、什么是 Spring Boot 结合 JSP Spring Boot 是一个快速构建 Spring 应用程序的工具。它可以减少 Spring 应用程序开发的时间和努力,因为它提供了各种默认配置,可以轻松地开始使用 Spring 应用程序的开发。 JSP(JavaServer …

    Java 2023年6月15日
    00
  • maven的安装配置以及在IDEA中的配置图文教程

    让我为你详细讲解Maven的安装配置以及在IDEA中的配置图文教程吧。 1. Maven的安装配置: 1.1 下载Maven 首先,你需要从Maven 官网下载最新的稳定版本。下载完成后,解压到任何你喜欢的目录中(比如:/usr/local/maven/) 1.2 配置环境变量 编辑环境变量配置文件(/etc/profile)并添加以下内容: export …

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