2021年5月26日星期三

入门shiro

Shiro

官方定义:Apache Shiro的首要目标是易于使用和理解。安全有时会非常复杂,甚至会很痛苦,但并非必须如此。框架应尽可能掩盖复杂性,并公开干净直观的API,以简化开发人员确保其应用程序安全的工作。

您可以使用Apache Shiro进行以下操作:

  • 验证用户身份以验证其身份

  • 对用户执行访问控制,例如:

    • 确定是否为用户分配了特定的安全角色
    • 确定是否允许用户做某事
  • 即使在没有Web或EJB容器的情况下,也可以在任何环境中使用Session API。

  • 在身份验证,访问控制或会话的生存期内对事件做出反应。

  • 汇总1个或更多用户安全数据的数据源,并将其全部显示为单个复合用户"视图"。

  • 启用单点登录(SSO)功能

  • 启用"记住我"服务以进行用户关联,而无需登录

Shiro的核心体系结构概念

  • 主题org.apache.shiro.subject.Subject
    当前与软件交互的实体(用户,第三方服务,计划任务等)的特定于安全性的"视图"。

  • SecurityManager(org.apache.shiro.mgt.SecurityManager)
    如上所述,这SecurityManager是Shiro体系结构的核心。它主要是一个"伞"对象,用于协调其托管组件以确保它们能够顺利协同工作。它还管理Shiro对每个应用程序用户的视图,因此它知道如何对每个用户执行安全性操作。

  • 认证器(org.apache.shiro.authc.Authenticator)
    Authenticator是,负责执行和用户反应,以验证(登录)的尝试的组件。当用户尝试登录时,该逻辑由执行Authenticator。该Authenticator知道如何与一个或多个协调Realms该商店相关的用户/帐户信息。从这些数据中获得的数据Realms用于验证用户的身份,以确保用户确实是他们所说的真实身份。

    • 认证策略(org.apache.shiro.authc.pam.AuthenticationStrategy)
      如果Realm配置了多个认证策略,则AuthenticationStrategy它将协调领域,以确定认证尝试成功或失败的条件(例如,一个领域成功但其他领域失败) ,尝试是否成功?所有领域都必须成功吗?只有第一个领域?)。
  • 认证器(org.apache.shiro.authz.Authorizer)
    Authorizer是部件负责确定用户在该应用程序的访问控制。它是最终表明是否允许用户做某事的机制。像一样AuthenticatorAuthorizer还知道如何与多个后端数据源进行协调以访问角色和权限信息。在Authorizer使用该信息来准确确定是否允许用户执行特定的操作。

  • SessionManager(org.apache.shiro.session.mgt.SessionManager)
    SessionManager知道如何创建和管理用户Session生命周期,提供在所有环境中的用户强大的会话体验。这是安全框架领域中的一项独特功能-Shiro能够在任何环境中本地管理用户会话,即使没有Web / Servlet或EJB容器也可以。默认情况下,Shiro将使用现有的会话机制(例如Servlet容器)(如果可用),但是如果没有这种机制,例如在独立应用程序或非Web环境中,它将使用其内置的企业会话管理来提供相同的编程经验。的SessionDAO存在允许任何数据源被用来坚持的会议。

    • SessionDAO(org.apache.shiro.session.mgt.eis.SessionDAO)
      SessionDAO执行Session持久代(CRUD)操作SessionManager。这允许将任何数据存储插入到会话管理基础结构中。
  • CacheManager的(org.apache.shiro.cache.CacheManager)
    CacheManager创建和管理Cache其他四郎组件使用实例的生命周期。因为Shiro可以访问许多后端数据源以进行身份​​验证,授权和会话管理,所以缓存一直是框架中的一流架构功能,可以在使用这些数据源时提高性能。可以将任何现代的开源和/或企业缓存产品插入Shiro,以提供快速有效的用户体验。

  • 密码术(org.apache.shiro.crypto。*)
    密码术是企业安全框架的自然补充。 Shiro的crypto软件包包含易于使用和理解的密码学密码,哈希(又名摘要)和不同编解码器实现的表示形式。该软件包中的所有类都经过精心设计,以使其易于使用和易于理解。使用Java的本机加密技术支持的任何人都知道,驯服它可能是具有挑战性的动物。 Shiro的加密API简化了复杂的Java机制,并使普通人容易使用加密。

  • 领域(org.apache.shiro.realm.Realm)
    如上所述,领域充当Shiro与应用程序的安全数据之间的"桥梁"或"连接器"。当真正需要与安全性相关的数据(例如用户帐户)进行交互以执行身份验证(登录)和授权(访问控制)时,Shiro会从一个或多个为应用程序配置的领域中查找许多此类内容。您可以根据Realms需要配置任意数量(通常每个数据源一个),并且Shiro会根据需要与它们进行协调,以进行身份​​验证和授权。

    这里我们就先做一个简单的入门:(整合spring boot)

#这里就把shiro的核心代码放进来,其余的就是简单的springboot 项目,视图层 +控制层+数据库层,完成业务的跳转,页面显示以及数据库的增删改查等等基础

ShiroConfig

@Configurationpublic class ShiroConfig { //第三步:ShiroFilterFactoryBean @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){  ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();  bean.setSecurityManager(defaultWebSecurityManager);  /*  * anon:无需认证就可以访问  * authc:必须认证才能访问  * user: 必须拥有 记住我 功能才能用  * perms: 拥有对某个资源的权限才能访问  * role: 拥有某个角色权限才能访问  * */  Map<String, String> filterMap = new LinkedHashMap<>();  //授权,正常情况下,未授权会跳转到未授权页面  //在这我们如果要改变是角色权限还是对某个资源的访问权限,需要在UserRealm类中去获取XXXX  // /XXXXX/XXXX是业务请求的路径  filterMap.put("/XXXXX/XXXX","roles[supermanager]");  filterMap.put("/XXXXX/XXXX","roles[manager]");  //注销  filterMap.put("/logout","logout");  bean.setFilterChainDefinitionMap(filterMap);  //未授权的请求  bean.setUnauthorizedUrl("/noauthorized");  //设置登录的请求  bean.setLoginUrl("/toLogin");  return bean; } //第二步:DefaultWebSecurityManager @Bean public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){  DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();  //关联userRealm  securityManager.setRealm(userRealm);  return securityManager; } //第一步:创建realm,需要自定义 @Bean public UserRealm userRealm(){  return new UserRealm(); } //整合shiroDialect:用来整合shiro thymeleaf @Bean public ShiroDialect getShiroDialect(){  return new ShiroDialect(); }}

UserRealm

public class UserRealm extends AuthorizingRealm { @Autowired UserService userService; //授权 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {  SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  //拿到当前登录的这个对象  Subject subject = SecurityUtils.getSubject();  User currentUser = (User) subject.getPrincipal();//拿到user对象  //拿到当前登录用户的角色,注意不管是拿role还是perms,那么数据库中都应该有这么一个字段信息保存想要的数据  info.addRole(currentUser.getRole());  return info; } //认证 @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {  UsernamePasswordToken userToken = (UsernamePasswordToken)token;  //用户名:密码 数据库中取  User user = userService.queryUserByName(userToken.getUsername());  System.out.println(userToken.getUsername());  //(userToken.getUsername().equals(user.getName()))==false 没解决这个问题  if (user==null){   return null;//抛出异常 用户名不存在  }  Subject currentSubjec = SecurityUtils.getSubject();  Session session = currentSubjec.getSession();  session.setAttribute("loginUser",user);  //密码认证,shiro做  return new SimpleAuthenticationInfo(user,user.getPwd(),""); }}

当然除了这些,还有记住我,缓存管理,等等很多功能,在我们初步了解shiro后,可以自己再去自我学习,这将会使我们更好的理解和学习shiro框架。









原文转载:http://www.shaoqun.com/a/760858.html

跨境电商:https://www.ikjzd.com/

c88是什么:https://www.ikjzd.com/w/1017.html

writer:https://www.ikjzd.com/w/1280


Shiro官方定义:ApacheShiro的首要目标是易于使用和理解。安全有时会非常复杂,甚至会很痛苦,但并非必须如此。框架应尽可能掩盖复杂性,并公开干净直观的API,以简化开发人员确保其应用程序安全的工作。您可以使用ApacheShiro进行以下操作:验证用户身份以验证其身份对用户执行访问控制,例如:确定是否为用户分配了特定的安全角色确定是否允许用户做某事即使在没有Web或EJB容器的情况下,也
mile:https://www.ikjzd.com/w/1746
ishare:https://www.ikjzd.com/w/2308
浩方:https://www.ikjzd.com/w/1046
无奈辞职or继续蹲坑,跨境老铁们的4月是怎样的?:https://www.ikjzd.com/articles/120119
日本逆算法征收关税|日本逆算法征收关税新闻资讯及日本逆算法征收关税报道:http://www.shaoqun.com/m/s/%E6%97%A5%E6%9C%AC%E9%80%86%E7%AE%97%E6%B3%95%E5%BE%81%E6%94%B6%E5%85%B3%E7%A8%8E.aspx
口述:老公在家没事就摸我 爱or怪癖:http://lady.shaoqun.com/m/a/15715.html