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")
    
  • 相关阅读:
    Java学习开篇
    《我的姐姐》
    世上本无事,庸人自扰之
    这48小时
    补觉
    淡定
    es java api 设置index mapping 报错 mapping source must be pairs of fieldnames and properties definition.
    java mongodb groupby分组查询
    linux 常用命令
    mongodb too many users are authenticated
  • 原文地址:https://www.cnblogs.com/mozq/p/11726478.html
Copyright © 2011-2022 走看看