apache shiro是一个灵活强大的开源安全框架。它能处理认证、授权、企业session管理以及加密。
apache shiro的初衷是简单上手易于理解。
shiro旨在在各种应用环境(小到命令行应用,大到企业级应用)实现以上功能,无需第三方依赖,容器或应用服务。当然需要的话可以集成到这些环境。
apache shiro的功能:
核心功能:
附加功能:
首先需要知道的是,shiro中所有的东西都是和securitymanage关联的。熟悉java security的人都知道,他是shiro的securitymanager概念,而不是java的 java.lang.securitymanager 。
所以开启shiro的第一步是配置好securitymanager实例。
配置:
# ============================================================================= # tutorial ini configuration # # usernames/passwords are based on the classic mel brooks' film "spaceballs" :) # ============================================================================= # ----------------------------------------------------------------------------- # users and their (optional) assigned roles # username = password, role1, role2, ..., rolen # ----------------------------------------------------------------------------- [users] root = secret, admin guest = guest, guest presidentskroob = 12345, president darkhelmet = ludicrousspeed, darklord, schwartz lonestarr = vespa, goodguy, schwartz # ----------------------------------------------------------------------------- # roles with assigned permissions # rolename = perm1, perm2, ..., permn # ----------------------------------------------------------------------------- [roles] admin = * schwartz = lightsaber:* goodguy = winnebago:drive:eagle5
创建一个securitymanager实例
public static void main(string[] args) { log.info("my first apache shiro application"); inisecuritymanagerfactory factory = new inisecuritymanagerfactory("classpath:shiro.ini"); securitymanager securitymanager = factory.getinstance(); securityutils.setsecuritymanager(securitymanager); system.exit(0); }
仅三行代码,shiro就在应用中添加了。接下来对这三行代码进行解释:
谈到应用的安全问题,我们很自然的会想到当前用户。shiro api使用subject来表示当前用户的概念。
在安全的世界里,’subject’主体可以表示一个人,也可以表示第三方进程,定时任务等当前与软件交互的任何事物。
session
session类似httpsessions,唯一不同的是它不需要http环境。
上面提到的subject表示当前用户,当前用户是谁,现在还是匿名用户,直到它们至少登录一次。
if(!subject.isauthenticated()) { usernamepasswordtoken usernamepasswordtoken = new usernamepasswordtoken("lonestarr", "vespa"); usernamepasswordtoken.setrememberme(true); subject.login(usernamepasswordtoken); }
如果登录失败了怎么办?你可以catch登录失败异常。
try { subject.login(usernamepasswordtoken); } catch (unknownaccountexception uae) { throw new unknownaccountexception("不存在该用户"); } catch (incorrectcredentialsexception ice) { throw new incorrectcredentialsexception("用户名或密码错误"); }
如对本文有疑问, 点击进行留言回复!!
详解SpringBoot修改启动端口server.port的四种方式
网友评论