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对用户的登陆验证

前台项目是用的公司统一的登陆,项目中去获取登陆的状态

posted @ 2023-02-02 09:41  星光闪闪  阅读(200)  评论(0)    收藏  举报