我是靠谱客的博主 文艺紫菜,最近开发中收集的这篇文章主要介绍Shiro 的学习总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一个简单的shiro应用流程,就是通过Subject来进行认证和授权,而Subject又委托给SecurityManager,然后向SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。

Subject :包含 principals(身份)、credentials(凭证)两部分;

SecurityManager :它管理着所有Subject,是Shiro的核心;

Realm :获取安全数据(如用户、角色、权限),即安全数据源;

AuthorizationInfo :为当前登录的用户授予角色和权限;

AuthenticationInfo :身份认证/登录,验证用户是不是拥有相应的身份;

SessionManager :shiro 自己的会话管理容器;

权限认证:

1).基于角色的认证

subject.hasrole(role);  //返回一个boolean
subject.hasroles(arrays.aslist(role1,role2));       //返回一个boolean数组,即每个角色的有无
subject.hasAllroles(arrays.aslist(role1,role2));    //返回一个boolean,即全有或不全有

subject.checkrole(role);    //无返回值,没有此角色报错
subject. checkroles (arrays.aslist(role1,role2));       //无返回值,没有此角色报错
subject. Checkroles (role1,role2);      //无返回值,没有此角色报错

2) 基于权限的认证

subject.ispermitted(权限);    //返回一个boolean
subject.ispermitted(权限1,权限2);   //返回一个boolean数组
subject.ispermittedall(权限1,权限2);    //返回一个boolean,即全有或不全有

shiro 与 spring的整合:

1、首先在web.xml文件中配置前端过滤器:

    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

2、在 spring 中配置 shiro

<!-- 自定义Realm -->
<bean class="com.eaphy.realm.MyRealm" id="myRealm"/>

<!-- 安全管理器 -->
<bean class="org.apache.shiro.web.mgt.DefaultWebSecurityManager" id="securityManager">
    <property name="realm" ref="myRealm"/>
</bean>

<!-- Shiro过滤器 -->
<bean class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" id="shiroFilter">
    <!-- Shiro的核心安全接口,这个属性是必须的 -->
    <property name="securityManager" ref="securityManager"/>
    <!-- 身份认证失败,则跳转到登录页面的配置 -->
    <property value="/index.jsp" name="loginUrl"/>
    <!-- 权限认证失败,则跳转到指定页面 -->
    <property value="/unauthor.jsp" name="unauthorizedUrl"/>
    <!-- Shiro连接约束配置,即过滤链的定义 -->
    <property name="filterChainDefinitions">
        <value> 
            /login=anon //任意用户都可访问
            /admin*=authc //用户必须登录才能访问
            /student=roles[teacher] //需要用户有用teacher权限
        </value>
    </property>
</bean>

<!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
<bean class="org.apache.shiro.spring.LifecycleBeanPostProcessor" id="lifecycleBeanPostProcessor"/>

<!-- 开启Shiro注解 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>

自定义 realm:

package com.eaphy.realm;


import javax.annotation.Resource;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

import com.eaphy.entity.User;
import com.eaphy.service.UserService;

public class MyRealm extends AuthorizingRealm{

    @Resource
    private UserService userService;

    /**
     * 为当限前登录的用户授予角色和权
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String userName=(String)principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo authorizationInfo=new SimpleAuthorizationInfo();
        authorizationInfo.setRoles(userService.getRoles(userName));
        authorizationInfo.setStringPermissions(userService.getPermissions(userName));
        return authorizationInfo;
    }

    /**
     * 验证当前登录的用户
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String userName=(String)token.getPrincipal();
            User user=userService.getByUserName(userName);
            if(user!=null){
                AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(user.getUserName(),user.getPassword(),"xx");
                return authcInfo;
            }else{
                return null;                
            }
    }

}

登录代码:

    @RequestMapping("/login")
    public String login(User user,HttpServletRequest request){
        Subject subject=SecurityUtils.getSubject();
        UsernamePasswordToken token=new UsernamePasswordToken(user.getUserName(), user.getPassword());
        try{
            subject.login(token);
            Session session=subject.getSession();
            System.out.println("sessionId:"+session.getId());
            System.out.println("sessionHost:"+session.getHost());
            System.out.println("sessionTimeout:"+session.getTimeout());
            session.setAttribute("info", "session的数据");
            return "redirect:/success.jsp";
        }catch(Exception e){
            e.printStackTrace();
            request.setAttribute("user", user);
            request.setAttribute("errorMsg", "用户名或密码错误!");
            return "index";
        }
    }

最后

以上就是文艺紫菜为你收集整理的Shiro 的学习总结的全部内容,希望文章能够帮你解决Shiro 的学习总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部