zoukankan      html  css  js  c++  java
  • shiro学习总结

    首先4个比较好的例子供参考:

    1.常规Spring MVC拦截器实现的认证和权限管理例子

    https://blog.csdn.net/u013647382/article/details/53995655

    2.Shiro+SSM整合例子带数据库可成功访问

    https://blog.csdn.net/zzhao114/article/details/55662585

    3.Shiro权限管理框架详解(讲解的非常好)

    https://www.cnblogs.com/jpfss/p/8352031.html

    4. Shiro权限控制过程

    http://itwgy.com/html/frame/159.html

    先巩固一下session客户端实现的过程:

    浏览器第一次访问某个javaee应用的地址时,发送的request的Cookie里是没有JSESSIONID的,

    当response时会Set-Cookie设上一个web服务器对本次会话分配的JSESSIONID,

    实际上HTTP协议是无状态的,每次请求都跟前一次没有什么关联,但只要你不是每次都重启浏览器来打开页面,

    在同一个浏览器进程中不断的打开同一个应用的地址,浏览器都会附带上同样的cookie信息。

    这样根据这个JSESSIONID web服务器就会把所有相同JSESSIONID连接识别成同一个会话。

    所以说对于web应用来说即使没登录也有session,只不过session中没有存储登录信息。

    因此注销时一定要清除session中的信息。注销后再登陆还是同一个JSESSIONID哦(先不管session过期的问题)。

    常规Spring MVC拦截器实现的认证和权限管理的主要流程:

    登录页面提交登录信息到控制器的登录处理方法,从数据库中根据用户名密码判断登录是否成功,

    成功的话将用户信息和权限放到session中。

    自定义的Spring MVC登录拦截器权限拦截器实际上就是从seesion中读取当前用户的登录和权限信息,进行对应的认证和权限匹配。

    用户是否登录就判断当前会话session中是否存有用户信息对象,有就认为已登录。

    权限就判断请求地址是否在权限列表中。

    Shiro实现的认证和权限管理的主要流程:

    未登录请求都转到配置的loginUrl上,

    登录页面提交登录信息到控制器的登录处理方法,

    调用SecurityUtils.getSubject().login(token),

    转到自定义的MyRealm域中的doGetAuthenticationInfo方法进行认证。

    成功的话将由shiro管理这次会话session控制了。不成功会抛出各种异常。

    对权限控制调用MyRealm域中的doGetAuthorizationInfo获得当前用户的权限,

    结合spring-shrio中的权限配置即可控制。

    通过比较可以看出用shiro的好处:

    无须再写自定义的SpringMVC登录拦截器和权限拦截器。

    但是要在web.xml中配置shrio拦截器。

    只要spring-shiro配置文件中配置好相关权限设置,

    配合MyRealm中

    doGetAuthenticationInfo登录验证

    doGetAuthorizationInfo读取用户权限

    即可同样实现。

    简单的登录权限验证功能跟自己写拦截器差不多,要求有高级功能可以拓展,自己实现就复杂了,

    重要的是别人都用了,不会就过时了。

    ============shiro配置学习================

    参考例子:https://blog.csdn.net/ruihaol/article/details/52186318

    <!-- 权限配置 -->    
            <property name="filterChainDefinitions">      
                <value>      
                    <!-- anon表示此地址不需要任何权限即可访问 -->    
                    /static/**=anon    
                    <!-- perms[user:query]表示访问此连接需要权限为user:query的用户 -->    
                    /user=perms[user:query]    
                    <!-- roles[manager]表示访问此连接需要用户的角色为manager -->    
                    /user/add=roles[manager]    
                    /user/del/**=roles[admin]    
                    /user/edit/**=roles[manager]    
                    <!--所有的请求(除去配置的静态资源请求或请求地址为anon的请求)都要通过登录验证,如果未登录则跳到/login-->      
                    /** = authc    
                </value>      
            </property>    
    
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {    
            //获取登录时输入的用户名    
            String loginName=(String) principalCollection.fromRealm(getName()).iterator().next();    
            //到数据库查是否有此对象    
            User user=userService.findByName(loginName);    
            if(user!=null){    
                //权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission)    
                SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();    
                //用户的角色集合    
                info.setRoles(user.getRolesName());    // getRolesName()返回Set<String>,存放用户所属角色的集合,比如admin manager noraml,小系统就一个用户一个角色就行了,角色id作为用户的一个字段
                //用户的角色对应的所有权限,如果只使用角色定义访问权限,下面的四行可以不要    
                List<Role> roleList=user.getRoleList();    
                for (Role role : roleList) {    
                    info.addStringPermissions(role.getPermissionsName()); // 将角色拥有的权限字符串Set<String>集合给该用户,比如query add delele 等
                }    
                return info;    
            }    
            return null;    
        }    
    

    可以看出通过shiro配置的filterChainDefinitions,可通过角色、权限(或称为资源)来共同控制,

    小系统通过基于角色授权控制就行了(角色能干什么其实就是定义哪个角色能访问什么地址,可以通过自定义filter来讲配置转到数据库中)。

    复杂的系统通过基于权限角色授权控制。


  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/coolzdp/p/8835948.html
Copyright © 2011-2022 走看看