Shiro面试题
001什么是权限?
①权限管理:一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。
②权限管理分类:
访问权限:管理员有增删改查权限,普通用户只有查询权限。
数据权限:管理员可以看到所有员工信息,但是员工只能看到自己的信息。
002什么是认证?
身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和密码,看其是否与系统中存储的该用户的用户名和密码一致,来判断用户身份是否正确。例如:密码登录,手机短信验证、三方授权等。
003Shiro框架用过吗?
Apache Shiro是一个强大且易用的Java安全框架,能够非常清晰的处理认证、授权、管理会话以及密码加密。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。
004Shiro的优点?
1.简单的身份验证,支持多种数据源
2.对角色的简单授权,支持细粒度的授权(方法)
3.支持一级缓存,以提升应用程序的性能
4.内置基于POJO的企业会话管理,适用于web及非web环境
5.非常简单的API加密
6.不跟任何框架绑定,可以独立运行
005Shiro的核心组件?
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如爬虫、机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者。
SecurityManager:安全管理器,即所有与安全有关的操作都会与SecurityManager交互,且它管理着所有Subject;可以看出它是shiro的核心, SecurityManager相当于spring mvc中的dispatcherServlet前端控制器。
Realm:域,shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。
006Shiro认证执行流程?
1)通过ini配置文件创建securityManager
2)调用subject.login方法主体提交认证,提交的token
3)securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。
4)ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息
5)IniRealm根据输入的token(UsernamePasswordToken)从 shiro.ini查询用户信息,根据账号查询用户信息(账号和密码)
如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)
如果查询不到,就给ModularRealmAuthenticator返回null
6)ModularRealmAuthenticator接收IniRealm返回Authentication认证信息;
如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)
007Shiro授权执行流程?
1)对subject进行授权,调用方法isPermitted("permission串")
2)SecurityManager执行授权,通过ModularRealmAuthorizer执行授权
3)ModularRealmAuthorizer执行realm(自定义的Realm)从数据库查询权限数据
调用realm的授权方法:doGetAuthorizationInfo
4)realm从数据库查询权限数据,返回ModularRealmAuthorizer
5)ModularRealmAuthorizer调用PermissionResolver进行权限串比对
6)如果比对后,isPermitted中"permission串"在realm查询到权限数据中,说明用户访问permission串有权限,否则 没有权限,抛出异常。
008Shiro注解有哪些?
1.@RequiresAuthentication : 表示当前Subject已经通过login进行了身份验证;即 Subject.isAuthenticated() 返回 true
2.@RequiresUser : 表示当前Subject 已经身份验证或者通过记住我登录的
3.@RequiresGuest : 表示当前Subject没有身份验证或通过记住我登陆过,即是游客身份
4.@RequiresRoles(value = { “admin”, “user” }, logical = Logical.AND) : 表示当前 Subject 需要角色 admin和user
5.@RequiresPermissions(value = { “user:a”, “user:b” }, logical = Logical.OR) : 表示当前 Subject 需要权限 user:a 或 user:b