shrio项目实例学习

2019-02-27  本文已影响0人  行人说

这个框架学习起来实在蛋疼,比较头疼的是英文。
有些英文单词是在过于相近,不好辨认。

搞清楚原理吧。

1.认证。
调用Subject.login(token)方法开始用户认证流程。

Subject currentUser = SecurityUtils.getSubject();//获取抽象用户。
UsernamePasswordToken token = new UsernamePasswordToken(username, password);//
token.setRememberMe(true);
try {
  currentUser.login(token);
} catch (UnknownAccountException e) {
  logger.error(String.format("user not found: %s", username), e); // 用户不存在
} catch (IncorrectCredentialsException e) {
  logger.error(String.format("incorrent credentials: %s", username), e); // 密码不正确
} catch (ConcurrentAccessException e) {
  logger.error(String.format("user has been authenticated: %s", username), e); // 用户重复登录
} catch (AccountException e) {
  logger.error(String.format("account except: %s", username), e); // 其他账户异常
}

2,授权。
shiro访问授权有3种实现方式:api调用,java注解,jsp标签。

API调用:
String role = "schwartz";
Subject currentUser = SecurityUtils.getSubject();
if(currentUser.hasRole(role)) {
  //用户属于角色schwartz
}else{
  //用户不属于角色schwartz
}

在spring框架中可以通过java注解:
@RequiresPermissions("system:user:view")

在JSP页面中还可以直接使用jsp标签:
<shiro:hasPermission name="log:manage:*">
  <a href="<%=request.getContextPath()%>/user/home">操作日志审计</a>

</shiro:hasPermission>。

3 ,突然灵光一闪。
对比了别人的时序图,发现其中的访问方式。
Subject,SecurityManager,Realm这三个都是相同的,不同的只是其中的Authenticator,Authorizer这两个,还有reaml中的调用方法不同,认证和授权在realm的调用方法。
doGetAuthorizationInfo,在授权时调用

doGetAuthenticationInfo,登录认证时调用。
//下面几行代码是从源码中拷贝出来的
clearRunAsIdentitiesInternal();
Subject subject = securityManager.login(this, token);//在调用这条代码时,会调用加入securityManager中的自定义好的realm的doGetAuthenticationInfo()这个方法。

/**
* 安全管理器
*/
@Bean
public SecurityManager securityManager(UserRealm userRealm)
{
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置realm.
securityManager.setRealm(userRealm);
// 记住我
securityManager.setRememberMeManager(rememberMeManager());
// 注入缓存管理器;
securityManager.setCacheManager(getEhCacheManager());
// session管理器
securityManager.setSessionManager(sessionManager());
return securityManager;
}
也可以注入多个realm,。

Authenticator(org.apache.shiro.authc.Authenticator)
负责执行和验证用户登录行为的组件,当一个用户试图登录,该逻辑是由Authenticator执行的。Authenticator知道如何去协调一个或者更多的realms,这些realms保存着用户信息。而且realms中的数据被取出用来验证用户。

Authorizer(org.apache.shiro.authz.Authorizer)
用户控制用户访问,主要是决定用户能否访问某些资源。类似于Authenticator,Authorizer也知道如何协调多个数据源并据此判断这些用户能否执行某个给定的Action。

  1. Shiro过滤器配置

ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// Shiro的核心安全接口,这个属性是必须的
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 身份认证失败,则跳转到登录页面的配置
shiroFilterFactoryBean.setLoginUrl(loginUrl);
// 权限认证失败,则跳转到指定页面
shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl);
// Shiro连接约束配置,即过滤链的定义
LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
//下面放一些路径和对应的权限
filterChainDefinitionMap.put("/favicon.ico", "anon");
filterChainDefinitionMap.put("/ruoyi.png
", "anon");
filterChainDefinitionMap.put("/css/", "anon");
filterChainDefinitionMap.put("/docs/
", "anon");

上一篇下一篇

猜你喜欢

热点阅读