shiro使用流程及原理

来源:互联网 发布:古驰精仿皮带淘宝 编辑:程序博客网 时间:2024/06/05 11:22

1、核心介绍
1)Application Code用户编写代码
2)Subject就是shiro管理的用户
3)SecurityManager安全管理器,就是shiro权限控制核心对象,在编程时,只需要操作Subject方法,底层调用SecurityManager方法,无需直接编程操作SecurityManager
4)Realm应用程序和安全数据之间连接器,应用程序进行权限控制读取安全数据(数据表、文件、网络…)通过Realm对象完成
2、Shiro执行流程
应用程序—>Subject—>SecurityManager—>Realm—>安全数据
3、Shiro进行权限控制的四种主要方式
1)在程序中通过Subject编程方式进行权限控制
2)配置Filter实现URL级别粗粒度权限控制
3)配置代理,基于注解实现细粒度权限控制
4)在页面中使用shiro自定义标签实现,页面显示权限控制
Subject:表示当前操作的主体用户,是一个抽象的概念,Subject可以进行登录、退出、权限判断等动作,通常一个subject与一个线程进行关联。
Realm:表示验证的数据源,存储用户的安全数据,可以进行用户名和密码的匹配,及用户权限查询。
认证大致原理:
shiro的核心是java servlet规范中的filter,通过配置拦截器,使用拦截器链来拦截请求,如果允许访问,则通过。通常情况下,系统的登录、退出会配置拦截器。
登录的时候,调用subject.login(token),token是用户验证信息,这个时候会在Realm(继承AuthorizingRealm类)中doGetAuthenticationInfo方法中进行认证。这个时候会把用户提交的验证信息与数据库中存储的认证信息进行比较(先判断用户名是否正确,自定义查询数据库,然后执行new SimpleAuthenticationInfo(user,
user.getPassword(), getName());),
参数: // 参数一:保存在subject中的信息
// 参数二:securityManager自动用查到的password和用户输入的密码进行比较,密码一致,登录成功,错误则抛出异常
// 参数三:realm名称一致则允许访问,并在浏览器种下此次回话的cookie,在服务器端存储session信息。退出的时候,调用subject.logout(),会清除回话信息。
// 基于subject实现登录
Subject subject = SecurityUtils.getSubject();
AuthenticationToken token = new UsernamePasswordToken(model.getUsername(), model.getPassword());
try {
// 登录成功shiro安全框架就会将用户的信息存放在session中
subject.login(token);

授权:执行Realm中的doGetAuthorizationInfo方法通过查询数据库的到对应的角色(role)和权限(Permission)将其放入SimpleAuthorizationInfo(类)中,然后配置文件中的
拦截器链(/pages/base/courier.html* = perms[courier:list],/pages/base/area.html* = roles[base])进行拦截

授权代码:

// 授权    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection pc) {        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();        // 得到当前用户        Subject subject = SecurityUtils.getSubject();        User user = (User) subject.getPrincipal();        // 调用业务层,// 查询用户对应的角色        List<Role> roles = roleService.findByUser(user);        for (Role role : roles) {            authorizationInfo.addRole(role.getKeyword());        }        // 调用业务层,查询用户所对应的权限        List<Permission> permissions = permissionService.findByUser(user);        for (Permission permission : permissions) {            authorizationInfo.addStringPermission(permission.getKeyword());        }        return authorizationInfo;

核心filter配置

<!-- 配置核心shiro的Filter -->    <!-- 该id和web.xml中的<filter-name>shiroFilter</filter-name>一致 -->    <!-- 拦截器链-->    <bean id="shiroFilter"         class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">         <!-- shiro 的核心安全接口-->         <property name="securityManager" ref="securityManager" />         <!-- 要求登录时的链接-->         <property name="loginUrl" value="/login.html" />        <!-- 登陆成功后要跳转的连接-->         <property name="successUrl" value="/index.html" />         <!-- 未授权时要跳转的连接-->         <property name="unauthorizedUrl" value="/unauthorized.html" />         <!-- shiro 连接约束配置-->         <property name="filterChainDefinitions" >             <value>             <!-- anon无须授权 authc需要授权 -->                /login.html* = anon                 /css/**=anon                /js/** = anon                 /images/**=anon                /services/**=anon                /validatecode.jsp*=anon                /user_login.action*=anon                <!--  表示用户必需拥有courier:list权限才可以正常发起’/courier.html’请求 -->                /pages/base/courier.html* = perms[courier:list]                <!-- 表示用户拥有base角色才可以正常发起’/area.html’请求  -->                /pages/base/area.html* = roles[base]                /** = authc            </value>         </property>    </bean>      Filter:         1.AnonymousFilter:通过此filter修饰的url,任何人都可以进行访问,即使没有进行权限认证         2.FormAuthenticationFilter:通过此filter修饰的url,会对请求的url进行验证,如果没有通过,则会重定向返回到loginurl         3.BasicHttpAuthenticationFilter:通过此filter修饰的url,要求用户已经通过认证,如果没有通过,则会要求通过Authorization 信息进行认证         4.LogoutFilter:通过此filter修饰的url,一旦收到url请求,则会立即调用subject进行退出,并重定向到redirectUrl         5.NoSessionCreationFilter:通过此filter修饰的url,不会创建任何会话         6.PermissionAuthorizationFilter:权限拦截器,验证用户是否具有相关权限         7.PortFilter:端口拦截器,不是通过制定端口访问url,将自动将端口重定向到指定端口         8.HttpMethodPermissionFilter:rest风格拦截器,配置rest的访问方式         9.RolesAuthorizationFilter:角色拦截器,未登陆,将跳转到loginurl,未授权,将跳转到unauthorizedUrl         10.SslFilter:HTTPS拦截器,需要以HTTPS的方式进行访问         11.UserFilter:用户拦截器,需要用户已经认证,或已经remember me    anon未认证可以访问    authc认证后可以访问    perms需要特定权限才能访问    roles需要特定角色才能访问    user需要特定用户才能访问    port需要特定端口才能访问(不常用)    rest根据指定HTTP请求才能访问(不常用)
原创粉丝点击