Skip to content

前后端分离下的用户认证和鉴权实践(三) Shiro简介 #4

Description

@ZhuXS

Shiro

  • Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务。并且相对于其他安全框架,Shiro 要简单的多,可以与Spring进行无缝集成。
    image

Shiro的几个关键概念

  • Subject:一个安全术语,意指“当前用户”,这里的用户可以指人、第三方进程等其他事物。一旦获得Subject,你就可以立即获得你希望用Shiro为当前用户做的90%的事情,如登录、登出、访问会话、执行授权检查等 -。这里的关键点是Shiro的API非常直观,因为它反映了开发者以‘每个用户’思考安全控制的自然趋势。同时,在代码的任何地方都能很轻松地访问Subject,允许在任何需要的地方进行安全操作。
    Subject subject = SecurityUtils.getSubject();
    subject.login(token);
  • SecurityManager:shiro框架的核心,管理所有用户更的安全操作,引用了多个内部嵌套安全组件(如Session的管理器,Realm等)
    @Bean(name = "securityManager")
     public DefaultWebSecurityManager securityManager(){
         DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
         //设置Realm
         securityManager.setRealm(shiroRealm());
         //设置session管理器
         securityManager.setSessionManager(sessionManager());
         return securityManager;
     }
  • Realm:Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”,也就是说,当与用户帐户这类安全相关数据进行交互,执行认证(登录)和授权(访问控制)时,Shiro会从应用配置的Realm中查找很多内容。
    Realm实质上是一个安全相关的DAO:它封装了数据源的连接细节,并在需要时将相关数据提供给Shiro。当配置Shiro时,你必须至少指定一个Realm,用于认证和(或)授权。配置多个Realm是可以的,但是至少需要一个。
    Realm有两个关键方法doGetAuthenticationInfo(AuthenticationToken authenticationToken)执行认证逻辑;doGetAuthorizationInfo(PrincipalCollection principalCollection)执行授权逻辑。
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //赋予角色和权限
    }
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) 
    throws AuthenticationException {
       //用户认证
    }
  • Filter链:Shiro通过其创新的URL过滤器链功能支持安全特定的过滤规则,它允许你为任何匹配的URL模式指定非正式的过滤器链。
    filterChainDefinitionManager.put("/userInfo","authc");  //需要登录
    filterChainDefinitionManager.put("/jobs/**","perms[JOB:CREATE]");  //需要[JOB:CREATE]权限
    filterChainDefinitionManager.put("/admin/**","roles[Admin]");  //需要Admin角色

相关资料

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions