1:关键对象
subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份的认证.
principal:身份信息,通常是唯一的,一个主体有多个身份信息,但是都有一个主的身份信息(primary principal)
credential:凭证信息,可以是密码,证书,指纹。。。。
总结:主体进行身份认证时需要提供身份信息和凭证 信息
2:授权流程
授权流程可以理解为: who 对what(which)资源进行how(怎样的) 操作
who: 主体 即subject, subject在认证通过后系统进行访问控制
what(which):资源(Resource),subject必须具备资源的访问权限才可以访问该资源.
how:权限/许可(permission)subject对该资源有怎样的权限:如增加?删除?修改?
3:权限模型
最终演变成:(权限其实是针对于资源来说的)
4:控制权限
4-1基于角色的访问
RBAC(role based access control)
缺点:这种方式不利于系统维护(可扩展不强)
4-2基于资源的访问 (建议使用这种)
RBAC(resource based access control)
5:粗粒度和细粒度权限
5-1概念
粗粒度权限管理:(页面的访问信息,仅仅能进页面,不能进行增删改查操作)对资源类型进行管理 比如:菜单, url连接, 用户添加页面, 类方法
细粒度的权限管理:(数据级别的权限管理:如某个模块的增删改查) 对资源实例的权限管理 比如:资源类型的具体化 比如用户id为001的修改url,
5-2如何实现粗粒度和细粒度的权限控制
实现粗粒度: (一般使用框架来实现)
比如:通过springMvc的拦截器实现授权(通过截取url 和数据库中拥有的权限资源做对比 没有就不会放行)
实现细粒度:
业务层实现控制
6:权限框架实现权限控制 (主要用来实现控制粗粒度的权限控制)
7: 不使用框架而是基于URL拦截的方式实现
在实际开发中比较常用的方式
8:Shiro
入门实例
package cn.shiro.authentication; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.apache.shiro.mgt.SecurityManager; import org.junit.Test; public class AuthenticationTest { @Test public void testLoginAndLogout() { //需要创建一个securityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini"); //创建一个SecurityManager SecurityManager securityManager = factory.getInstance(); //将securityManager设置到当前运行环境中 SecurityUtils.setSecurityManager(securityManager); //获取到里面穿件的subject Subject subject = SecurityUtils.getSubject(); //在认证提交前准备token(令牌) UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111"); //执行提交 try { subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); } //是否验证通过 boolean isAuthenticated = subject.isAuthenticated(); System.out.println(isAuthenticated); //执行退出操作 subject.logout(); } }