apache shiro,apache shiro 认证对象是全局的吗

apache shiro,apache shiro 认证对象是全局的吗

apache shiro目录

shior名词解释

apache shiro 认证对象是全局的吗

Apache Shiro is a powerful and flexible Java security framework that provides a comprehensive set of security features for applications. It offers authentication, authorization, session management, and cryptography services, along with support for various authentication mechanisms such as LDAP, OAuth, and Kerberos. Shiro is easy to use and integrate with existing applications, and it provides a simple and intuitive API for developers to work with. It can also be extended to support custom security requirements and integrates with various web frameworks and application servers. Overall, Apache Shiro is a reliable and efficient solution for building secure and robust applications.”

shior名词解释

Shiro是什么

1、Apache Shiro是Java的一个安全框架。

对比另一个安全框架Spring Sercurity,它更简单和灵活。

2、Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用JavaEE环境。

3、Shiro可以帮助我们完成:认证、授权、加密、会话管理、Web集成、缓存等。

shiro有三大核心组件:

1、Subject:是shiro提供给外界的唯一接口,外界发起的请求都必须通过subject,也就是说 Shiro 的对外API 核心就是 Subject。

Subject 代表了当前“用户”, 这个用户不一定是一个具体的人,与当前应用交互的任何东西都是 Subject,如网络爬虫,机器人等;与 Subject 的所有交互都会委托给 SecurityManager;Subject 其实是一个门面,SecurityManager 才是实际的执行者;

2、SecurityManager:安全管理器;是 Shiro 的核心;所有与安全有关的操作都会与SecurityManager 交互;且其管理着所有 Subject;它负责与 Shiro 的其他组件进行交互,它相当于 SpringMVC 中DispatcherServlet 的角色

3、Realm:Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色/ 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource

apache shiro 认证对象是全局的吗

Apache Shiro验证(Authentication)

验证(Authentication):身份验证的过程–也就是证明一个用户的真实身份。

为了证明用户身份,需要提供系统理解和相信的身份信息和证据。

需要通过向shiro提供用户的身份(Principals)和证明(credentials)来判定是否和系统所要求的匹配。

身份(Principals)是Subject的“身份属性”,可以是任何与Subject相关的标识,比如说名称(给定名称)、名字(姓或者昵称)、用户名、安全号码等等,当然像昵称这样的内容不能很好的对Subject进行独特标识,所以最好的身份信息(Principals)是使用在程序中唯一的标识–典型的使用用户名或邮件地址。

最主要的身份

虽然shiro可以使用任何数量的身份,Shiro还是希望一个程序精确地使用一个主要的身份–一个仅有的唯一标识Subject值。

在多数程序中经常会是一个用户名、邮件地址或者全局唯一的用户ID。

证明(Credentials)通常是只有Subject知道的机密内容,用来证明他们真正拥有所需的身份,一些简单的证书例子如密码、指纹、眼底扫描和X.509证书等。

最常见的身份/证明是用户名和密码,用户名是所需的身份说明,密码是证明身份的证据。

如果一个提交的密码和系统要求的一致,程序就认为该用户身份正确,因为其他人不应该知道同样的密码。

Authenticating对象

Subject验证的过程可以有效地划分分以下三个步骤:

1.收集Subject提交的身份和证明;

2.向Authenticating提交身份和证明;

3.如果提交的内容正确,允许访问,否则重新尝试验证或阻止访问。

下面的代码示范了Shiro API如何实现这些步骤:

第一步:收集用户身份和证明

//Example using mostcommon scenario of username/password pair:

UsernamePasswordTokentoken = new UsernamePasswordToken(username, password);

//”Remember Me” built-in:

token.setRememberMe(true);

在这里我们使用UsernamePasswordToken,支持所有常用的用户名/密码验证途径,这是一个org.apache.shiro.authc.AuthenticationToken接口的实现,这个接口被shiro认证系统用来提交身份和证明。

从程序终端用户获取信息的过程与shiro的AuthenticationToken完全无关。

你可以随自己喜欢构造和引用AuthenticationToken–它是协议不可知论者。

这个例子同样显示我们希望shiro在尝试验证时执行“Remember Me”服务,这确保shiro在用户今后返回系统时能记住他们的身份,我们会在以后的章节讨论“Remember Me”服务。

第二步:提交身份和证明

当身份和证明住处被收集并实例化为一个认证令牌后,我们需要向shiro提交令牌以执行真正的验证尝试:

Subject currentUser =SecurityUtils.getSubject();

currentUser.login(token);

在获取当前执行的Subject后,我们执行一个单独的login命令,将之前创建的认证令牌实例传给它。

使用login方法将有效地执行身份验证。

第三步:处理成功或失败

当login函数没有返回信息时表明验证通过了。

程序可以继续运行,此时执行SecurityUtils.getSubject()将返回验证后的Subject实例,subject.isAuthenticated()将返回true。

但是如果login失败了呢?例如,用户提供了一个错误的密码或者因访问系统次数过多而被锁定将会怎样呢?

shiro拥有丰富的运行期异常(AuthenticationException)可以精确标明为何验证失败,你可以将login放入到try/catch块中并捕获所有你想捕获的异常并对它们做出处理。

例如:

try {

currentUser.login(token);

} catch (UnknownAccountException uae ) { …

} catch (IncorrectCredentialsException ice ) { …

} catch (LockedAccountException lae ) { …

} catch (ExcessiveAttemptsException eae ) { …

} … catch your own…

} catch (AuthenticationException ae ) {

//unexpected error?

}

//No problems,continue on as expected…

如果原有的异常不能满足你的需求,可以创建自定义的AuthenticationExceptions来表示特定的失败场景。

登录失败小贴士

虽然你的代码可以对指定的异常做出处理并执行某些所需的逻辑,但有经验的安全做法是仅向终端用户输出一般的失败信息,例如“错误的用户名和密码”。

这确保不向尝试攻击你的黑客提供有用的信息。

已记住(Remembered) vs 已验证(Authenticated)

如上例所示,shiro支持在登录过程中执行"remember me",在此值得指出,一个已记住的Subject(remembered Subject)和一个正常通过认证的Subject(authenticated Subject)在shiro是完全不同的。

记住的(Remembered):一个被记住的Subject没有已知身份(也就是说subject.getPrincipals()返回空),但是它的身份被先前的认证过程记住,并存于先前session中,一个被认为记住的对象在执行subject.isRemembered()返回真。

已验证(Authenticated):一个被验证的Subject是成功验证后(如登录成功)并存于当前session中,一个被认为验证过的对象调用subject.isAuthenticated()将返回真。

给TA打赏
共{{data.count}}人
人已打赏
python

掌握sql可以找什么工作,SQL数据库专业的就业方向

2024-3-30 14:29:42

python

高级数据库工程师,高级数据库管理工程师证书有用吗

2024-3-30 14:35:50

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
打开微信,扫描左侧二维码,关注【旅游人lvyouren】,发送【101】获取验证码,输入获取到的验证码即可解锁复制功能,解锁之后可复制网站任意一篇文章,验证码每月更新一次。
提交