shiro面试题
shiro简介
是一个开源安全框架。
可以实现身份认证,授权,会话管理和加密。
使用shiro可以方便的进行认证授权管理
说明:
(1)身份认证/登录(Authentication),验证用户是不是拥有相应的身份;
(2)授权(Authorization),即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
(3)会话管理(Session Manager),即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;
(4)加密(Cryptography),保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
shiro的认证和授权
用户访问shiro保护的url需要经过Realm来进行认证和权限检查,访问通过才能够访问对应的url对应的资源
可以在Realm中授权,在要访问的方法上利用注解规定需要什么权限(如:@RequiresPermissions("showDepartment")),没有权限不能访问,返回错误页面(spring中有配)
用的比较多的继承AuthorizingRealm定义认证授权逻辑,还可以继承CAS Realm跟cas整合
(Shiro 认证与授权处理过程
被 Shiro 保护的资源,才会经过认证与授权过程。用户访问受 Shiro 保护的 URL;例如 http://host/security/action.do。
Shiro 首先检查用户是否已经通过认证,如果未通过认证检查,则跳转到登录页面,否则进行授权检查。认证过程需要通过 Realm 来获取用户及密码信息,通常情况我们实现 JDBC Realm,此时用户认证所需要的信息从数据库获取。如果使用了缓存,除第一次外用户信息从缓存获取。
认证通过后接受 Shiro 授权检查,授权检查同样需要通过 Realm 获取用户权限信息。Shiro 需要的用户权限信息包括 Role 或 Permission,可以是其中任何一种或同时两者,具体取决于受保护资源的配置。如果用户权限信息未包含 Shiro 需要的 Role 或 Permission,授权不通过。只有授权通过,才可以访问受保护 URL 对应的资源,否则跳转到“未经授权页面”。)
认证
引入依赖
需要在web.xml中配置过滤器,
|
<filter> <filter-name>shiroSecurityFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>shiroSecurityFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
在spring配置文件中配置认证和授权信息,跳转策略
|
<bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- 在没有登录直接访问一个url时跳转到登录界面 在用户名为null,或者用户名密码错误的时候,跳转到登录页面 --> <property name="loginUrl" value="/login.jsp"></property> <property name="successUrl" value="/index.jsp"></property> <!-- 当访问一个没有获得授权的资源的时候,跳转到该页面 --> <property name="unauthorizedUrl" value="/unauthorized.jsp"></property> <property name="securityManager" ref="securityManager"></property> <property name="filterChainDefinitions"> <value> /login.jsp* = anon /loginAction_login.action* = anon /departmentAction_*.action* = perms["admin","aaa"] /*.action* = authc </value> </property> </bean> |
编写继承AuthorizingRealm的realm类,然后编写action来处理请求
|
public class OARealm extends AuthorizingRealm{ /** * 完成认证 */ @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { //得到含有username和password的token UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken)token; User user = this.loginService.login(usernamePasswordToken.getUsername()); if(user==null){ return null; }else{ //把用户的信息封装到该对象中 AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user,user.getPassword(),getName()); return authenticationInfo; } } } |
在公司项目中shiro是怎么使用的
后台项目都是使用shiro对用户的登陆验证
前台项目是用的公司统一的登陆,项目中去获取登陆的状态

浙公网安备 33010602011771号