百木园-与人分享,
就是让自己快乐。

shiro中常用的对象和方法

一.配置类中常用的对象和方法

  1.ShiroFilterFactoryBean()对象:通过创建的该对象调用setSecurityManager方法去关联DefaultWebSecurityManager对象

  2.DefaultWebSecurityManager()对象:通过创建的该对象调用setRealm方法关联创建的Realm对象,其中Realm对象时自己定义的一个Realm类

  3.setSecurityManager()方法:通过创建ShiroFilterFactoryBean对象调用该方法,设置安全管理器,其参数为DefaultWebSecurityManager对象,可以从创建的ShiroFilterFactoryBean方法中传参获取

  4.setFilterChainDefinitionMap()方法:通过创建ShiroFilterFactoryBean对象调用该方法,设置shiro内置的过滤器,其参数为一个map集合

  5.setLoginUrl()方法:通过创建ShiroFilterFactoryBean对象调用该方法,设置如果没有登录用户时要跳转的页面的地址

  6.setRealm()方法:通过创建的DefaultWebSecurityManager对象调用该方法,设置Realm对象,其参数为Realm对象

  7.代码样例:

package com.xiaoma.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Author:xiaoma
 * FileName:MyShiroConfig
 * Data:2022/5/25 21:34
 */
//这里要做三件事,创建ShiroFilterFactoryBean,创建DefaultWebSecurityManager,创建realm对象,这三件事要倒着做
@Configuration
public class MyShiroConfig {
    //创建ShiroFilterFactoryBean,关联DefaultWebSecurityManager
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier(\"DWSM\") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        filterFactoryBean.setSecurityManager(defaultWebSecurityManager);

        /*
        * 添加shiro内置的过滤器
        * anon:无需认证就可以访问
        * authc:必须认证才可以访问
        * user:必须拥有记住我功能才能使用
        * perms:拥有对某个资源的权限才可以访问
        * role:拥有某个角色权限才可以访问
        * */
        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put(\"/user/add\",\"authc\");
        filterMap.put(\"/user/update\",\"authc\");
        //他需要一个map集合
        filterFactoryBean.setFilterChainDefinitionMap(filterMap);
        //如果没有登录用户,要跳转到登录页
        filterFactoryBean.setLoginUrl(\"/toLogin\");

        return filterFactoryBean;
    }

    //创建DefaultWebSecurityManager,通过@Qualifier注解关联realm对象
    /*
    * @Qualifier注解中的参数
    *   如果要关联的方法的bean没有name属性,那么就是该方法名,默认也是这种方式
    *   如果bean注解有name属性,那么@Qualifier注解中的参数就是bean注解的name属性
    * */
    @Bean(name = \"DWSM\")
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier(\"userRealm\") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //创建realm对象,这个对象要自定义,继承AuthorizingRealm,并重写其中的方法
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }
}

二..Realm类中常用的对象和方法

  1.UsernamePasswordToken()对象:用来设置用户名和密码的Token,设置是否记住我等,其常用方法有(除了构造器外)

    

  2.SimpleAuthenticationInfo()对象:可以用来让shiro帮我们验证一些东西的,以验证密码为例,代码如下

    2.1Realm类中的代码

package com.xiaoma.config;

import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * Author:xiaoma
 * FileName:UserRealm
 * Data:2022/5/25 21:34
 */
public class UserRealm extends AuthorizingRealm {
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println(\"执行了授权\");
        return null;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println(\"执行了认证\");
        //用户名密码从数据库中取出就可以了
        String name=\"root\";
        String pwd=\"123\";
        UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
        //用户名认证
        if (!userToken.getUsername().equals(name)) {
            //抛出异常UnknownAccountException
            return null;
        }
        //密码认证shiro帮我们做
        return new SimpleAuthenticationInfo(\"\",pwd,\"\");
    }
}

    2.2controller接口的代码

    @RequestMapping(\"/login\")
    public String userLogin(String username,String password,Model model){
        //获取当前用户
        Subject subject = SecurityUtils.getSubject();

        //封装用户登录的数据
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);

        //执行登录方法并捕获相关异常
        try {
            //登录成功返回首页
            subject.login(token);
            return \"index\";
        }catch (UnknownAccountException e){
            model.addAttribute(\"msg\",\"用户名错误\");
            return \"login\";
        }catch (IncorrectCredentialsException e){
            model.addAttribute(\"msg\",\"密码错误\");
            return \"login\";
        }
    }

    2.3登陆界面的代码

<!DOCTYPE html>
<html lang=\"en\">
<head>
    <meta charset=\"UTF-8\">
    <title>登录</title>
</head>
<body>
    <h1>登录</h1>
    <p th:text=\"${msg}\" style=\"color: red\"></p>
    <form action=\"/login\">
        <p>用户名:<input name=\"username\" type=\"text\"></p>
        <p>密 码:<input name=\"password\" type=\"password\"></p>
        <p><input type=\"submit\"></p>
    </form>
</body>
</html>

 


来源:https://www.cnblogs.com/XiaoMaGuai/p/16316376.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » shiro中常用的对象和方法

相关推荐

  • 暂无文章