基于spring boot 2和shiro实现身份验证案例

实现基于Spring Boot 2和Shiro的身份验证,可以按以下步骤进行:

步骤一:创建Spring Boot项目

使用Spring Initializr或者其他方式创建一个Spring Boot项目。

步骤二:添加Shiro依赖

在项目的pom.xml中添加Shiro的依赖:

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-spring-boot-starter</artifactId>
  <version>1.5.3</version>
</dependency>

步骤三:配置Shiro

在配置类中创建ShiroFilterFactoryBean和SecurityManager的bean:

@Configuration
public class ShiroConfig {
    @Bean
    ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        shiroFilterFactoryBean.setLoginUrl("/login.html");
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized.html");

        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;
    }

    @Bean
    SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm());
        return securityManager;
    }

    @Bean
    Realm realm() {
        CustomRealm realm = new CustomRealm();
        return realm;
    }
}

这里的CustomRealm需要自己实现,继承AuthorizingRealm,然后实现doGetAuthorizationInfo和doGetAuthenticationInfo。

步骤四:编写登录和退出

登录和退出可以参考以下示例:

@Controller
public class LoginController {

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

    @RequestMapping("/doLogin")
    @ResponseBody
    public String doLogin(String username, String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
        } catch (UnknownAccountException e) {
            return "用户名不存在";
        } catch (IncorrectCredentialsException e) {
            return "密码不正确";
        }
        return "登录成功";
    }

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

步骤五:编写html

可以参考以下的登录和退出html:

<!DOCTYPE html>
<html>
<head>
    <title>登录</title>
</head>
<body>
    <form action="doLogin" method="POST">
        <div>
            <label>用户名:</label>
            <input type="text" name="username"/>
        </div>
        <div>
            <label>密码:</label>
            <input type="password" name="password"/>
        </div>
        <div>
            <input type="submit" value="登录"/>
        </div>
    </form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
    <title>退出</title>
</head>
<body>
    <form id="logout-form" action="#" method="POST">
        <input type="hidden" name="_csrf" value="${_csrf.token}"/>
        <input type="submit" value="退出"/>
    </form>
    <script src="/js/jquery.min.js"></script>
    <script>
        $(function() {
            $("#logout-form").submit(function() {
                $.ajax({
                    url: "/logout",
                    type: "POST",
                    success: function() {
                        location.href = "/login.html";
                    }
                });
                return false;
            });
        });
    </script>
</body>
</html>

以上就是利用Spring Boot 2和Shiro实现身份验证的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于spring boot 2和shiro实现身份验证案例 - Python技术站

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

相关文章

  • 解决spring项目找不到Aspect依赖注解的问题

    当我们在Spring项目中使用AspectJ时,可能会遇到找不到Aspect依赖注解的问题。这是由于AspectJ依赖的jar文件没有正确添加到项目的classpath中所致。以下是解决该问题的完整攻略: 第一步:添加AspectJ的依赖 在项目的pom.xml中添加以下依赖: <dependency> <groupId>org.as…

    Java 2023年5月31日
    00
  • MyBatis注解实现动态SQL问题

    下面是针对”MyBatis注解实现动态SQL问题”的完整攻略: 动态SQL语句的背景: 在进行数据库操作时,我们经常会用到动态SQL语句,而MyBatis也提供了多种方式来实现动态SQL,比如XML方式等,但是本文主要讲解注解实现动态SQL的问题。注解方式的实现相比XML更加简洁,可读性更强。在注解方式中,我们可以使用MyBatis提供的@SelectPro…

    Java 2023年5月20日
    00
  • Java中的ArrayList容量及扩容方式

    下面我将为您详细讲解Java中的ArrayList容量及扩容方式的完整攻略。 概述 ArrayList是Java集合框架中的一种常用容器,它可以动态地增长和缩小。在往ArrayList中添加元素时,程序可以不必关心容量问题,ArrayList会自动管理容量。 容量 ArrayList底层是用数组实现的,我们可以通过capacity()方法获得ArrayLis…

    Java 2023年5月26日
    00
  • 基于SpringBoot实现上传2种方法工程代码实例

    下面是关于“基于SpringBoot实现上传2种方法工程代码实例”的攻略: 1. 概述 SpringBoot提供了很多方便开发的功能,其中之一就是文件上传。文件上传需要前端页面和后端接口配合实现。前端页面负责UI界面展示和获取用户输入,后端接口负责接收上传的文件并保存在服务器上。 2. 文件上传方法 2.1. 前端表单上传 前端表单上传是指用户在页面上填写表…

    Java 2023年5月20日
    00
  • 使用JDBC连接Mysql数据库会出现的问题总结

    使用JDBC连接Mysql数据库会出现的问题总结 JDBC是Java针对各种关系型数据库提供的一种标准的接口,可以大大简化Java程序连接数据库的开发工作。但是,在使用JDBC连接Mysql数据库的过程中,常常会遇到一些问题。本篇攻略将会针对常见的问题进行总结,并给出相应的解决方案。 1. ClassNotFoundException 该异常通常在程序中出现…

    Java 2023年5月20日
    00
  • 精通Java接口的使用与原理

    精通Java接口的使用与原理 什么是接口 Java接口是一个抽象编程结构,定义了类或对象应该实现的一组方法及其签名。接口在Java中为多态性提供了一种体系结构和模板。它仅仅定义了方法的名称、参数和返回类型,而没有方法的实现。接口可以看做是一种“契约”,规定了实现接口的类或者对象需要满足的“协议”。 接口可以在Java中起到以下几个作用: 接口帮助我们定义一套…

    Java 2023年5月26日
    00
  • Struts 2 实现Action的几种方式

    Struts 2 实现 Action 的几种方式包括以下几种:基于方法、基于类、基于接口、基于注解,以及自定义 Action。 基于方法 这种方式是在 Action 类中定义不同的方法来处理不同的请求,例如: public class UserAction{ public String list(){ // 处理列表请求 return "list&…

    Java 2023年5月20日
    00
  • Java如何实现http接口参数和返回值加密

    要实现HTTP接口参数和返回值加密,可以采用对称加密和非对称加密的方式。 对称加密 对称加密算法是加密和解密密钥相同的加密算法,常见的有DES、3DES、AES等。对称加密的加解密速度快,但密钥传输、保密性等存在问题。 在Java中使用AES对称加密方式来对参数和返回值进行加密。使用如下代码: import javax.crypto.Cipher; impo…

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