8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出)
Java知識,就點上方藍字關注我們
Shiro介紹:
01
Apache Shiro 是 Java 的一個安全(權限)框架
Subject:正如我們在剛才提到教程,在Subject本質上是當前正在執(zhí)行的用戶的安全特定“視圖”。“用戶”一詞通常表示一個人,一個人Subject可以是一個人,但它也可以表示第三方服務,守護程序帳戶,cron作業(yè)或類似的東西-基本上是當前與該軟件交互的任何東西。
Subject實例都綁定到(并要求)SecurityManager。當您與互動時Subject,這些互動會轉化為與主題相關的互動SecurityManager。
SecurityManager:SecurityManager是Shiro體系結構的核心,并充當一種“傘”對象,可協調其內部安全組件,這些組件一起形成對象圖。但是,一旦為應用程序配置了SecurityManager及其內部對象圖,通常就不理會它,并且應用程序開發(fā)人員幾乎所有的時間都花在SubjectAPI上。
Realms:領域充當Shiro與應用程序的安全數據之間的“橋梁”或“連接器”。當真正需要與安全性相關的數據(例如用戶帳戶)進行交互以執(zhí)行身份驗證(登錄)和授權(訪問控制)時,Shiro會從一個或多個為應用程序配置的領域中查找許多此類內容。
組件流程:
02
Shiro的架構:
03
搭建環(huán)境
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("執(zhí)行授權邏輯!"); ? ? ? ?return null; ? ?} ? ?/** ? ? * 認證邏輯 ? ? * @param authenticationToken ? ? * @return ? ? * @throws AuthenticationException ? ? */ ? ?@Override ? ?protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { ? ? ? ?System.out.println("執(zhí)行認證邏輯!"); //當前登陸的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; ? ?} ? ?/** ? ? * 創(chuàng)建Realm(Shiro連接數據的橋梁) ? ? * @return 返回一個Realm ? ? */ ? ?@Bean("userRealm") ? ?public UserRealm gerUserRealm() { ? ? ? ?return new UserRealm(); ? ?}}
執(zhí)行登陸功能:
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.執(zhí)行登陸方法 ? ? ? ? ? ? ? ?subject.login(token); ? ? ? ? ? ? ? ?//沒有異常拋出就是登陸成功! ? ? ? ? ? ? ? ?return Result.success("登陸成功!"); ? ? ? ? ? ?} catch (UnknownAccountException e) { ? ? ? ? ? ? ? ?//UnknownAccountException異常:用戶名不存在 ? ? ? ? ? ? ? ? ?return Result.failure("用戶不存在!"); ? ? ? ? ? ?} catch (IncorrectCredentialsException e) { ? ? ? ? ? ? ? ?//IncorrectCredentialsException異常:密碼錯誤 ? ? ? ? ? ? ? ? ?return Result.failure("密碼錯誤!"); ? ? ? ? ? ?} ? ? ? ?} ? ? ? ?//如果參數為空 ? ? ? ?return Result.failure("登陸參數不能為空!"); ? ?}
執(zhí)行結果
{ ? ?"code": 200, ? ?"message": "處理成功!", ? ?"data": "登陸成功!"
}
執(zhí)行登出功能:
08
/** * 退出登陸 * @return */@GetMapping("/logout")@ResponseBodypublic Result logout() { ? ?//獲取當前主體 ? ?Subject subject = SecurityUtils.getSubject(); ? ?//如果已登錄 ? ?if (subject.isAuthenticated()) { ? ? ? ?//退出登陸 ? ? ? ?subject.logout(); ? ? ? ?return Result.success("退出成功!"); ? ?} ? ?return Result.failure("退出失敗!");}
執(zhí)行結果
{ ? ?"code": 200, ? ?"message": "處理成功!", ? ?"data": "退出成功!"
}
微信號:codewhite077作者:JUNSHI關注我們,了解更多總結
以上是生活随笔為你收集整理的8321r 当前不允许登陆_Apache Shiro安全框架实现身份认证(登陆与登出)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS开发之普通网络异步请求与文件下载方
- 下一篇: 【许晓笛】 EOS 智能合约案例解析(2