zoukankan      html  css  js  c++  java
  • Shiro简单入门+个人理解(2)

    今天开始了Shiro认证及授权的部分,认证及授权是Shiro的主要功能,虽然Shiro还具有加密等功能,但在实际开发时,很少会使用到,在公司一般都有自己的一套加密方式,具体我就不说话了,毕竟有保密协议

    废话不多说开始吧

    首先开始Shiro认证流程

    身份认证:判定用户是否是系统的合法用户。

    用户访问系统资源时的认证(对用户身份信息的认证)流程如下:

     

    具体流程分析如下:

    1)系统调用subject的login方法将用户信息提交给SecurityManager

    2)SecurityManager将认证操作委托给认证器对象Authenticator

    3)Authenticator将身份信息传递给Realm。

    4)Realm访问数据库获取用户信息然后对信息进行封装并返回。

    5)Authenticator 对realm返回的信息进行身份认证。

    Controller类的实现

     @RequestMapping("doLogin")

           @ResponseBody

           public JsonResult doLogin(String username,String password){

               //1.获取Subject对象

               Subject subject=SecurityUtils.getSubject();

               //2.通过Subject提交用户信息,交给shiro框架进行认证操作

               //2.1对用户进行封装

               UsernamePasswordToken token=

               new UsernamePasswordToken(

                       username,//身份信息

                       password);//凭证信息

               //2.2对用户信息进行身份认证

               subject.login(token);

               //分析:

               //1)token会传给shiro的SecurityManager

               //2)SecurityManager将token传递给认证管理器

               //3)认证管理器会将token传递给realm

               return new JsonResult("login ok");

           }

    }

    自定义Realm(ShiroUserRealm)


    /**
    * 通过此对象获取用户身份相关信息,用户权限相关信息
    * 间接的实现了Realm接口
    */
    @Service
    public class ShiroUserRealm extends AuthorizingRealm {//AuthenticatingRealm (提供了认证数据的获取方法)
    //我在此处删除了相关的dao接口,它们只要应用于获取id

    //同时在这里我未用到md5加密所以取消了加密方式

    /**

         * 设置凭证匹配器

         * @param credentialsMatcher

         */

        @Override

        public void setCredentialsMatcher(

    CredentialsMatcher credentialsMatcher) {

            HashedCredentialsMatcher cMatcher=

            new HashedCredentialsMatcher();

            cMatcher.setHashAlgorithmName("MD5");

            super.setCredentialsMatcher(cMatcher);

    }


    //自定义缓存map(缓存用户权限信息)
    private Map<String,SimpleAuthorizationInfo> authorMap=
    new ConcurrentHashMap<String,SimpleAuthorizationInfo>();


    /**此方法提供认证数据的获取操作*/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
    AuthenticationToken token)
    throws AuthenticationException {

    System.out.println("==获取用户认证信息==");
    //1.获取用户名(从令牌对象获取)
    UsernamePasswordToken upToken=
    (UsernamePasswordToken)token;
    String username=upToken.getUsername();
    // String username=(String)token.getPrincipal();
    // System.out.println("username="+username);
    //2.基于用户名执行查询操作获取用户对象
    User user=sysUserDao.findUserByUserName(username);
    //3.对用户对象进行判定
    //3.1判定用户是否存在
    if(user==null)
    throw new UnknownAccountException();
    //4.对用户相关信息进行封装(密码)
    SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(
    user,//principal (用户新身份)

    //因为取消加密方式所以省去了

    credentialsSalt, //credentialsSalt(盐)


    user.getUSER_PWD(),//hashedCredentials(已加密的凭证)
    getName());//realmName real name
    //5.返回封装好的数据(返回给认证管理器)
    return info;//交给认证管理器


    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
    PrincipalCollection principals) {
    return null;
    }
    }

    此外自定义realm就已经结束

    以下就是拦截

    在shiro.xml里随心所欲的设置过滤规则

    <!-- 定义过滤规则(哪些资源允许匿名访问,哪些资源必须授权访问)-->
    <property name="FilterChainDefinitionMap">
    <map>
    <!-- 说明:anon表示允许匿名访问, authc表示授权访问-->

    <entry key="/css/**" value="anon"/>
    <entry key="/db_sql/**" value="anon"/>
    <entry key="/images/**" value="anon"/>
    <entry key="/js/**" value="anon"/>
    <entry key="/META-INF/**" value="anon"/>
    <entry key="/yzm/**" value="anon"/>

    <entry key="/login/getLogins.do" value="anon"/>
    <entry key="/doLogout.do" value="logout"/>
    <entry key="/**" value="authc"/>


    </map>
    </property>
    </bean>

    正常使用就会产生如果你在浏览器进行url填写为授权访问路径,则会跳转你所规定的配置页面,配置页面详情看前一篇文章的spring-shiro.xml

  • 相关阅读:
    VMware下安装Ubuntu虚拟机
    py3+urllib+bs4+反爬,20+行代码教你爬取豆瓣妹子图
    老铁,这年头得玩玩这个:Git基本操作【github】
    本地Git与GitHub服务器建立连接(SSH方式通信)
    python开启httpserver服务在自动化测试中的一个小运用
    python测试webservice接口
    Xcache3.2.0不支持php7.0.11
    Nginx设置alias别名目录访问phpmyadmin
    CentOS 7.2.1511编译安装Nginx1.10.1+MySQL5.7.15+PHP7.0.11
    CentOS平滑更新nginx版本
  • 原文地址:https://www.cnblogs.com/zdsgjh/p/10388259.html
Copyright © 2011-2022 走看看