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")
原文地址:https://www.cnblogs.com/mozq/p/11726478.html