Shrio学习心得

最近又跟这个老师学了shrio,他先解释了认证和授权,然后以原始的过滤器(或者springmvc拦截器)的方式进行认证和授权。然后说明了使用角色进行授权的问题
推荐使用权限授权。

    认证和授权---认证   即登陆 是否是系统的用户
                                   |
                                   ----授权  即验证登陆后是否有某个url的访问权限

然后讲了shrio,整体下来并没有觉得shrio的优势在哪,就是权限和资源的映射配置分散开了,不用在数据库中把所有的资源都跟权限做映射了。其实很多项目中权限跟资源属于一回事。
使用shrio分开就跟方便了。

        用户表  (用户角色表 多对多)   角色表    (角色权限表 多对多)  权限表       (权限资源表 多对多)         资源表

下面一张图是我理解的在与web和spirng整合后的结构图:

 

    1、shiro在spring的配置就不细说了,配置了过滤器,配置了代理和注解,在jsp页面使用标签
    2、shrio认证和权限检查过程大家都熟知,securityManager最终调用realm检查权限,很多都是shrio写死的通用检查功能,想要实现自己的方式就要继承和实现。
    3、与web和spring整合后,从哪里调用shrio的认证权限检查以及认证/检查成功和失败后又会怎么处理是重点

    在web中shrio与spring集成后有三个调用入口
        1:过滤器链,这个过滤器链被spring在web中注册的过滤器代理调用。过滤器链会调用securityManager进行认证和权限检查。
        过滤器链中包含了各种过滤器,有静态资源过滤器,认证过滤器,权限过滤器。匿名过滤器直接返回静态资源并return false不进行后续过滤。认证和权限过滤去都会继续过滤 和进入springmvc的disparcherservlet。一般我们不使用权限过滤器,因为配置太多。我们只适用匿名过滤器和认证过滤器。如果认证过滤器发现没有认证,则跳转到配置的登陆url中,如果认证失败,则跳转到处理失败的url中,如果认证成功则重定向到上次访问的url。

        2:经过过滤器后请求进入了springmvc的controller中。根据shrio的注解,这里我们的controller实际上是经过shrio处理过的代理。在执行controller之前进行了增强就是查询了securitymanager进行了权限验证,如果验证成功,继续执行我们写的controller代码。如果验证失败则出现异常,进入springmvc的异常处理器。

        3:在jsp页面,使用shrio标签,则在web容器解析标签时执行标签对应的代码,查询securitymanager,如果验证成功则显示,不成功不显示。

    可能出现的问题:
    1:由于某些项目没有配置spring,直接使用了springmvc,那么就不能使用过滤器链,不能认证了。但是注解的权限认证应该还是能用。所以正常的方式还是spring容器也要使用。
    2:由于springmvc的各种插件使得,controller被多次被代理,即生成了代理的代理,这样难免会出现一些错误。
    3:匿名过滤器不会继续放行,认证过滤器会继续放行,而且认证过滤其会先执行。
    4:使用了注解的权限检查,那么过滤器链中配置的权限错误页面是不会执行的,这是两个不同的地方。

 

 

/*一些废话:

很久没有写博客了,最近看了shrio权限管理,首先看的是《跟我学shrio》,我是那种没有耐心的人,看了十来章就看不下去了,看的云里雾里。索性找视频看,然后就找到了网上的资源,这个xxxx的教育机构真不错,里面的老师的水平也很高,我的jdbc,DBCP,spring,springmvc,mybatis都是跟这个老师的视频学的。


    懂得了spring
    1:明白了web容器,spring就是web中设置的一个listener产生的容器,
    2:所有的要用的东西(bean)都在容器中产生,并根据配置的依赖进行植入,实现控制反转,
    3:又知道了每个bean的产生前后都调用了后处理bean来进行加工,以此我们可以方便的对bean进行动态代理,由此也产生了面向切面的编程AOP
    4:明白了spring使用aspectj的注解,大部分情况只是用了他的注解,没有用aspectj的实现机制,而是用了java代理和cglib代理来实现。
    5:有了动态代理很多东西可以很方便的实现,


    明白了springmvc
    1:springmvc不依赖spring,springmvc是web中的一个servlet,使用这个servlet会产生一个spring容器的子类,容器中实现spring的功能。
    2:如果又spring容器存在,则继承spring的容器,可以获得spring容器的所有bean,但spring容器不能获取springmvc子容器中的bean。
    3:springmvc由disparcherservlet前端控制器获取请求到处理器映射器,映射器返回处理器链,并通过文件转换器,属性编辑器,参数转换器等将请求中的参数转
       换位controller中的参数,并传入处理器适配器,适配器调用controller的方法返回modleandview,通过视图解析器解析,最后渲染视图并返回,每个xx器都是
       由前端控制器调用并获取返回结果的。
    
    spring框架由于可以方便的进行动态代理,实现aop,所以第三方插件可以方便的进行集成。通过对需要使用插件功能的bean全部生成代理来增强的方式来应用第三方
插件。其中spirngmvc拦截器就是AOP,springmvc的异常拦截器也是AOP。spring的事务控制也是aop。aspectj也是AOP。

    学习了mybatis,明白了面向对象的方式处理数据库,以前查询数据库都是获取了直接量,map,list<map>形式,以后就需要将结果包装成pojo。以对象的方式操作
数据库结果。当然mybatis是半面先对象。*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值