SpringBoot-shiro登入攔截.使用者認證.整合Mybatis

一隻小小狗發表於2020-12-14

1.SpringBoot-shiro登入攔截

package com.wjm.config;

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class ShiroConfig {

	//ShiroFilterFactoryBean  3.  認證
	public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager defaultWebSecurityManager) {
		ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
		
		//關聯DefaultWebSecurityManager
		//設定安全管理器
		bean.setSecurityManager(defaultWebSecurityManager);
		
		
		
		bean.setLoginUrl("/login");//提供登入到url
        bean.setSuccessUrl("/index");//提供登陸成功的url
		//新增shiro內建過濾器
		/**
		 * anno 無需認證就可以訪問
		 * authc 認證了才能訪問
		 * user 必須有記住我功能才能用
		 * perms 擁有對某個資源的許可權才能訪問
		 */
		Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
//		filterChainDefinitionMap.put("/user/add", "user");
//		filterChainDefinitionMap.put("/user/update", "user");
		filterChainDefinitionMap.put("/user/*", "authc");
		bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
		
		//設定登入的請求
		bean.setLoginUrl("/toLogin");
		
		return bean;
	}

	/**
	 * @Qualifier(“實現類名稱”)表明注入的是哪一個實現類的bean
	 */
	//DafaultWebSecurityManager  2.
	@Bean(name = "securityManager")
	public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm realm) {
		DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
		
		//關聯userRealm
		defaultWebSecurityManager.setRealm(realm);
		
		return defaultWebSecurityManager;
	}
	
	//建立 Realm 物件自定義  1.
	@Bean
	public UserRealm userRealm() {
		return new UserRealm();
	}
}

在這裡插入圖片描述
在這裡插入圖片描述

2.使用者認證

本來程式碼應該寫入 Realm 自定義類中
但是為了看起來比較舒服

	@RequestMapping("/login")
	public String login(String username,String password,Model model) {
		// 獲取當前使用者
		Subject subject = SecurityUtils.getSubject();
		// 封裝使用者資料
		UsernamePasswordToken token = new UsernamePasswordToken(username,password);
		
		//執行登入方法
		try {
			subject.login(token);
			return "index";
		} catch (UnknownAccountException e) {//使用者名稱不存在
			model.addAttribute("msg","使用者名稱不存在");
			return "login";
		} catch (IncorrectCredentialsException e) {//使用者名稱不存在
			model.addAttribute("msg","賬號或者密碼錯誤");
			return "login";
		} 
		
	}

在這裡插入圖片描述
直接在UserRealm 進行認證

package com.wjm.config;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/** 
* 自定義的 UserRealm 
* 授權領域
*/
public class UserRealm extends AuthorizingRealm{


	//獲取授權資訊
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection token) {
		System.out.println("執行了=》授權doGetAuthorizationInfo");
		return null;
	}

	//認證
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
		System.out.println("執行了=》認證doGetAuthorizationInfo");
		
		//資料庫中 獲取使用者名稱 密碼
		String name = "root";
		String password = "123456";
		//這裡直接 拿到UsernamePasswordToken
		UsernamePasswordToken user = (UsernamePasswordToken)token;
		
		if (!user.getUsername().equals(name)) {
			return null; //丟擲異常UnknownAccountException
		}
		
		//密碼認證,shiro做,不需要我來操作
		return new SimpleAuthenticationInfo("",password,"");
	}

}

整合Mybatis

1.pom座標

 <!-- shiro整合spring -->
         <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.12</version>
        </dependency>

2.mybatis的基本步驟

完成

相關文章