zoukankan      html  css  js  c++  java
  • springboot shiro 基本整合

    springboot shiro 基本整合

    https://www.w3cschool.cn/shiro/c52r1iff.html
    http://shiro.apache.org/configuration.html#Configuration-ProgrammaticConfiguration
    

    步骤

    依赖和配置

    定义 org.apache.shiro.realm.Realm 使用 IniRealm

    定义 org.apache.shiro.mgt.SecurityManager

    定义 org.apache.shiro.spring.web.ShiroFilterFactoryBean

    指定登录页面 shiroFilterFactoryBean.setLoginUrl("/login.html")

    放行登录相关接口和静态资源

    定义登录Controller

    Map<String, String> map = new HashMap<>();
    map.put("/login/pc", "anon");
    shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    

    依赖

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

    配置

    server:
      servlet:
        context-path: /mozq
    
    # user.ini
    [users]
    liubei=123
    

    添加Bean

    package com.mozq.sb.shiro03.config;
    
    import org.apache.shiro.realm.Realm;
    import org.apache.shiro.realm.text.IniRealm;
    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 org.apache.shiro.mgt.SecurityManager;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @Configuration
    public class ShiroConfig {
        //自定义 org.apache.shiro.realm.Realm
        @Bean
        public IniRealm iniRealm(){
            IniRealm iniRealm = new IniRealm("classpath:user.ini");
            return iniRealm;
        }
        //定义 org.apache.shiro.mgt.SecurityManager
        @Bean
        public SecurityManager securityManager(Realm realm){
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(realm);
            return securityManager;
        }
    
        //定义 org.apache.shiro.spring.web.ShiroFilterFactoryBean
        @Bean
        public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
            ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
            shiroFilterFactoryBean.setSecurityManager(securityManager);
            //过滤的路径
            Map<String, String> map = new HashMap<>();
            map.put("/**", "authc");
            map.put("/login/pc", "anon");//放行登录相关接口
            map.put("/js/jquery-3.4.1.js", "anon");//放行登录页面静态资源,不然登录页报错。
    
            shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
            shiroFilterFactoryBean.setLoginUrl("/login.html");//登录页面
            return shiroFilterFactoryBean;
        }
    }
    

    登录页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="js/jquery-3.4.1.js"></script>
    </head>
    <body>
        <form action="/login/pc" method="post">
            <input id="username" name="username">
            <input id="password" name="password">
    <!--        <input type="button" value="登录"> -->
            <input type="button" value="登录" onclick="login()">
        </form>
    <script>
        var serverPath = "/mozq";
        function login() {
            var username = $("#username").val();
            var password = $("#password").val();
            console.log(username);
            console.log(password);
            $.ajax({//Content-Type: application/x-www-form-urlencoded; charset=UTF-8
                url: serverPath + "/login/pc",
                type: "post",
                data: {"username": username, "password": password},
                success: function (res) {
                    if(res === "success"){
                        window.location.href = "http://www.baidu.com";
                    }else{
                        alert(res);
                    }
                }
            });
        }
    </script>
    </body>
    </html>
    

    登录Controller

    package com.mozq.sb.shiro03.controller;
    
    import org.apache.shiro.SecurityUtils;
    import org.apache.shiro.authc.AuthenticationException;
    import org.apache.shiro.authc.UsernamePasswordToken;
    import org.apache.shiro.subject.Subject;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    
    @RestController
    @RequestMapping("/login")
    public class LoginController {
        @RequestMapping("/pc")
        public String login(@RequestParam String username, @RequestParam String password){
            Subject subject = SecurityUtils.getSubject();
            UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username, password);
            try {
                subject.login(usernamePasswordToken);
            } catch (AuthenticationException e) {
                e.printStackTrace();
                return "身份验证错误";
            }
            return "success";
        }
    }
    

    bugs

    1.
    Caused by: org.apache.shiro.config.ConfigurationException: java.io.IOException: Resource [classpath: user.ini] could not be found.
    原因:[classpath: user.ini] 路径中加了空格
    
    2.
    不配置登录跳转页面,则默认跳转到 http://localhost:8080/login.jsp
    配置登录接口:shiroFilterFactoryBean.setLoginUrl("/login.html");//则这个接口成为放行的,即anon
    如果项目路径为: localhost/mozq
    则此时登录跳转到:localhost/mozq/login.html
    
    3.
    如果登录相关的其他接口不放行,则重定向到登录页面。
    放行登录相关的接口:map.put("/login/pc", "anon");
    如果项目路径为: localhost/mozq
    则此时放行路径:localhost/mozq/login/pc
    
    4.
    org.apache.shiro.authc.UnknownAccountException: Realm [org.apache.shiro.realm.text.IniRealm@4c9f4ee9] was unable to find account data for the submitted AuthenticationToken [org.apache.shiro.authc.UsernamePasswordToken - 1, rememberMe=false].
    原因:user.ini中什么都没有写。则登录验证失败。
    方案:添加用户信息
        [users]
        liubei=123
    
    5.
    Uncaught SyntaxError: Unexpected token <
    原因:shiro 将login.html的资源 jquery-3.4.1.js 拦截了,无法访问,所以报了这个错误。
    方案:
    	放行静态资源
    	map.put("/js/jquery-3.4.1.js", "anon")
    
  • 相关阅读:
    Swift 可选项 Optional
    Swift 枚举的用法
    Swift 函数
    Swift 流程控制
    iPhone 相册取出视频宽高分辨率是相反的 解决方案
    Mac 下GitHub 访问慢解决方案
    Ipa 脱壳工具 Clutch dumpdecrypted 使用
    逆向 make 打包错误解决方案 make: *** [internal-package] Error 2
    删除 $PATH 路径下多余的文件地址
    Reveal 破解 无限试用
  • 原文地址:https://www.cnblogs.com/mozq/p/11726478.html
Copyright © 2011-2022 走看看