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来讲配置转到数据库中)。

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


  • 相关阅读:
    模块移植-加宏选择性编译
    模块-各个模块的路径所在
    ubuntu-系统卡慢解决(转载)
    meld文件的脚本
    artTemplate模板引擎
    前端完全分离和前端不完全分离
    px em rem的区别
    原型和原型链
    阻止默认事件
    document.ready和onload的区别
  • 原文地址:https://www.cnblogs.com/coolzdp/p/8835948.html
Copyright © 2011-2022 走看看