发表于: 2020-09-25 23:06:10

1 1411


今天完成的事:

了解权限模型。

shiro入门。

权限模型分为两种:

基于角色访问控制

RBAC(role  based  access  control),基于角色的访问控制。

    //如果该user是部门经理则可以访问if中的代码
if(user.hasRole('部门经理')){
//系统资源内容
//用户报表查看
   }

角色针对人划分的,人作为用户在系统中属于活动内容,如果该 角色可以访问的资源出现变更,需要修改你的代码了,

if(user.hasRole('部门经理') || user.hasRole('总经理')  )
//系统资源内容
//用户报表查看
   }
}

基于角色的访问控制是不利于系统维护(可扩展性不强)。

基于资源的访问控制

RBAC(Resource  based  access  control),基于资源的访问控制。

资源在系统中是不变的,比如资源有:类中的方法,页面中的按钮。

对资源的访问需要具有permission权限,代码可以写为:

//对资源的访问需要具有permission权限,代码可以写为:
if(user.hasPermission('用户报表查看(权限标识符)'))
{
//系统资源内容
//用户报表查看
}

建议使用基于资源的访问控制实现权限管理。


为什么使用Shiro

我们在使用URL拦截的时候,要将所有的URL都配置起来,繁琐、不易维护。

而我们的Shiro实现系统的权限管理,有效提高开发效率,从而降低开发成本。


shiro的核心

Subject本质上是当前正在执行的用户的安全特定的“视图”。而“使用者”这个词通常意味着一个人,Subject可以是个人,但也可以代表第三方服务、守护进程帐户、cron作业或任何类似的东西--基本上是当前与软件交互的任何东西。

SecurityManager:SecurityManager是Shiro体系结构的核心,类似于工地上的项目经理,协调其内部安全组件,从而形成对象图。但是,一旦为应用程序配置了SecurityManager及其内部对象图,它通常会被单独使用,应用程序开发人员几乎将所有的时间都花在SubjectAPI.

Realms:充当Shiro和应用程序安全数据之间的“桥梁”或“连接器”。当涉及到实际与用户帐户等与安全相关的数据交互以执行身份验证(登录)和授权(访问控制)时,Shiro从为应用程序配置的一个或多个Realm中查找其中许多内容。

从这个意义上说, Realm 本质上是一个特定于安全的领域。Dao它封装数据源的连接细节,并根据需要将相关数据提供给Shiro。配置Shiro时,必须指定至少一个用于身份验证和/或授权的域。这个SecurityManager可以配置多个领域,但至少需要一个。

Shiro提供开箱即用的Realm连接到许多安全数据源(也称为目录),如LDAP、关系数据库(JDBC)、INI和属性文件等文本配置源,等等。如果默认的Realm不能满足您的需要,您可以插入自己的领域实现来表示自定义数据源。

和其他内部部件一样,ShiroSecurityManager管理如何使用Realms获取安全和身份数据,以便表示为Subject实例。


Shiro总的架构:

subject:主体,可以是用户也可以是程序,主体要访问系统,系统需要对主体进行认证、授权。

securityManager:安全管理器,主体进行认证和授权都 是通过securityManager进行。

authenticator:认证器,主体进行认证最终通过authenticator进行的。

authorizer:授权器,主体进行授权最终通过authorizer进行的。

sessionManager:web应用中一般是用web容器对session进行管理,shiro也提供一套session管理的方式。

SessionDao:  通过SessionDao管理session数据,针对个性化的session数据存储需要使用sessionDao。

cache Manager:缓存管理器,主要对session和授权数据进行缓存,比如将授权数据通过cacheManager进行缓存管理,和ehcache整合对缓存数据进行管理。

realm:域,领域,相当于数据源,通过realm存取认证、授权相关数据。

cryptography:密码管理,提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

code:

自定义UserRealm:

public class UserRealm extends AuthorizingRealm {
//授权
   @Override
   protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行了----》授权");
       return null;
   }
//认证
   @Override
   protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
System.out.println("执行了---->认证");
       return null;
   }
}

配置类配置好SecurityManager

@Configuration
public class ShiroConfig {

//创建shiroFilterBean.3
   @Bean
   public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
       //设置安全管理器
       bean.setSecurityManager(defaultWebSecurityManager);
       //添加shiro的内置过滤器:
       /*  
        1.anon:无需认证即可访问。
        2.authc:必须需要认证才能访问。
        3.user:必须拥有记住我才能访问。
        4.perms:拥有对某个资源的权限才能访问。
        5.role:拥有某个权限才能访问。
        */
       Map<String,String> filterMap=new LinkedHashMap<>();
       filterMap.put("/add","authc");
       filterMap.put("/update","authc");
       bean.setLoginUrl("/login");
       bean.setFilterChainDefinitionMap(filterMap);
       return bean;
   }
//创建DefaultWebSecurityManager对象,2
   @Bean(name="securityManager")
public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
       //关联UserRealm
       defaultWebSecurityManager.setRealm(userRealm);
       return defaultWebSecurityManager;
   }
//创建Realm对象,需要自定义类1
   @Bean
   public UserRealm userRealm(){

return  new UserRealm();
   }
}

测试:

点击update

拦截成功。

明天的计划:

shiro整合mybatis。

遇到的问题:null

收获:

shiro的简单使用。


返回列表 返回列表
评论

    分享到