日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出)

發布時間:2023/12/19 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java知識,就點上方藍字關注我們

Shiro介紹:

01

Apache Shiro 是 Java 的一個安全(權限)框架

Subject:正如我們在剛才提到教程,在Subject本質上是當前正在執行的用戶的安全特定“視圖”。“用戶”一詞通常表示一個人,一個人Subject可以是一個人,但它也可以表示第三方服務,守護程序帳戶,cron作業或類似的東西-基本上是當前與該軟件交互的任何東西。

Subject實例都綁定到(并要求)SecurityManager。當您與互動時Subject,這些互動會轉化為與主題相關的互動SecurityManager。

SecurityManager:SecurityManager是Shiro體系結構的核心,并充當一種“傘”對象,可協調其內部安全組件,這些組件一起形成對象圖。但是,一旦為應用程序配置了SecurityManager及其內部對象圖,通常就不理會它,并且應用程序開發人員幾乎所有的時間都花在SubjectAPI上。

Realms:領域充當Shiro與應用程序的安全數據之間的“橋梁”或“連接器”。當真正需要與安全性相關的數據(例如用戶帳戶)進行交互以執行身份驗證(登錄)和授權(訪問控制)時,Shiro會從一個或多個為應用程序配置的領域中查找許多此類內容。

組件流程:

02

Shiro的架構:

03

搭建環境

Springboot+mybatis+mysql+shiro

user表:

01

CREATE TABLE `user` ( ?`id` int(11) NOT NULL AUTO_INCREMENT, ?`username` varchar(20) NOT NULL, ?`password` varchar(50) NOT NULL, ?`nick_name` varchar(50) NOT NULL, ?PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

user類:

02

@Datapublic class User { ? ?private Integer id; ? ?private String username; ? ?private String password; ? ?private String nickName;}

UserMapper:

03

public interface UserMapper { ? ?@Select("select * from user where username = #{username}") ? ?User findUserByUserName(String username);}

UserService:

04

public interface UserService { ? ?/** ? ? * 根據用戶名查詢用戶信息 ? ? * @param username ? ? * @return ? ? */ ? ?User findUserByUserName(String username);}@Service("userService")public class UserServiceImpl implements UserService { ? ?@Autowired ? ?private UserMapper userMapper; ? ?@Override ? ?public User findUserByUserName(String username) { ? ? ? ?return userMapper.findUserByUserName(username); ? ?}}

Shiro配置UserRealm:

05

public class UserRealm extends AuthorizingRealm { ? ?private static final Logger LOGGER = LoggerFactory.getLogger(UserRealm.class); ? ?@Autowired ? ?private UserService userService; ? ?/** ? ? * 授權邏輯 ? ? * @param principalCollection ? ? * @return ? ? */ ? ?@Override ? ?protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { ? ? ? ?System.out.println("執行授權邏輯!"); ? ? ? ?return null; ? ?} ? ?/** ? ? * 認證邏輯 ? ? * @param authenticationToken ? ? * @return ? ? * @throws AuthenticationException ? ? */ ? ?@Override ? ?protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { ? ? ? ?System.out.println("執行認證邏輯!"); //當前登陸的token信息 ? ? ? ?UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken; ? ? ? ?//獲取用戶:使用token判斷用戶名 ? ? ? ?User user = userService.findUserByUserName(token.getUsername()); ? ? ? ?//如果用戶不存在: ? ? ? ?if (user == null) { ? ? ? ? ? ?LOGGER.info("用戶不存在{}"); ? ? ? ? ? ?//返回null,底層拋出異常:UnKnowAccountException ? ? ? ? ? ?return null; ? ? ? ?} //2.判斷密碼 : user會傳到Subject中 ? ? ? ?return new SimpleAuthenticationInfo(user, user.getPassword(), ""); ? ?}}

ShiroConfig:

06

@Configurationpublic class ShiroConfig { ? ?/** ? ? * 安全過濾器 ? ? * @param defaultWebSecurityManager 安全管理器 ? ? * @return 返回Shiro過濾器工廠 ? ? */ ? ?@Bean ? ?public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) { ? ? ? ?ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); ? ? ? ?//設置安全管理器 ? ? ? ?shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager); ? ? ? ?//設置登陸的url ? ? ? ?shiroFilterFactoryBean.setLoginUrl("/login"); ? ? ? ?return shiroFilterFactoryBean; ? ?} ? ?/** ? ? * 默認安全管理器 ? ? * @param userRealm 關聯的自定義Realm ? ? * @return 默認安全管理器 ? ? */ ? ?@Bean("securityManager") ? ?public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) { ? ? ? ?DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); ? ? ? ?//關聯realm ? ? ? ?manager.setRealm(userRealm); ? ? ? ?return manager; ? ?} ? ?/** ? ? * 創建Realm(Shiro連接數據的橋梁) ? ? * @return 返回一個Realm ? ? */ ? ?@Bean("userRealm") ? ?public UserRealm gerUserRealm() { ? ? ? ?return new UserRealm(); ? ?}}

執行登陸功能:

07

/** ? ? * 登陸邏輯 ? ? * @param user ? ? * @return ? ? */ ? ?@PostMapping("/login") ? ?@ResponseBody ? ?public Result login(User user) { ? ? ? ? ? ? ? ?if (user != null) { ? ? ? ? ? ? //1. 獲取subject 用戶主體 ? ? ? ? ? ?Subject subject = SecurityUtils.getSubject(); ? ? ? ? ? ?//2. 封裝用戶數據Token登陸 ? ? ? ? ? ?UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); ? ? ? ? ? ?try { ? ? ? ? ? ? ? ?//3.執行登陸方法 ? ? ? ? ? ? ? ?subject.login(token); ? ? ? ? ? ? ? ?//沒有異常拋出就是登陸成功! ? ? ? ? ? ? ? ?return Result.success("登陸成功!"); ? ? ? ? ? ?} catch (UnknownAccountException e) { ? ? ? ? ? ? ? ?//UnknownAccountException異常:用戶名不存在 ? ? ? ? ? ? ? ? ?return Result.failure("用戶不存在!"); ? ? ? ? ? ?} catch (IncorrectCredentialsException e) { ? ? ? ? ? ? ? ?//IncorrectCredentialsException異常:密碼錯誤 ? ? ? ? ? ? ? ? ?return Result.failure("密碼錯誤!"); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?//如果參數為空 ? ? ? ?return Result.failure("登陸參數不能為空!"); ? ?}

執行結果

{ ? ?"code": 200, ? ?"message": "處理成功!", ? ?"data": "登陸成功!"

}

執行登出功能:

08

/** * 退出登陸 * @return */@GetMapping("/logout")@ResponseBodypublic Result logout() { ? ?//獲取當前主體 ? ?Subject subject = SecurityUtils.getSubject(); ? ?//如果已登錄 ? ?if (subject.isAuthenticated()) { ? ? ? ?//退出登陸 ? ? ? ?subject.logout(); ? ? ? ?return Result.success("退出成功!"); ? ?} ? ?return Result.failure("退出失敗!");}

執行結果

{ ? ?"code": 200, ? ?"message": "處理成功!", ? ?"data": "退出成功!"

}

微信號:codewhite077作者:JUNSHI關注我們,了解更多

總結

以上是生活随笔為你收集整理的8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。