shiro的使用

知识:

  • 英语单词

    • Authentication 认证

    • Authorization 授权

    • principal 首要的,本金,校长

  • shiro三大对象

    • Subject 用户

    • SecurityManager 管理用户

    • Reaim 连接用户

使用步骤

  • 导入依赖

<dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.7.1</version>
</dependency>
  • 创建配置类,创建三个返回shiro主要对象的方法

    • ShiroFilterFactorBean 3 用途:拦截请求,定义拦截后返回的页面

    • DefaultWebSecurityManger 2

    • UserRealm 1

  • @Configuration
    public class ShiroConfig {

    //ShiroFilterFactoryBean 3
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
    ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
    //设置安全管理器(根据权限,拦截请求)
    bean.setSecurityManager(defaultWebSecurityManager);

    //添加shiro内置过滤器
    /*过滤的属性
    * anon:无需认证就可以访问
    * authc:必须认证
    * user:必须拥有记住我功能才可以使用。不用
    * perms:拥有对某个资源的权限才可以访问
    * role:拥有某个角色可以访问
    * 下面四行代码完成登陆拦截功能
    * */
    //拦截
    Map<String, String> filterMap=new HashMap<>();
    //授权信息配置
    filterMap.put("/user/*","perms[user:add]");//表示是一个user请求,有add权限
    filterMap.put("/level1/user/*","perms[user:update]");
    filterMap.put("/level2/user/*","authc");
    bean.setFilterChainDefinitionMap(filterMap);

    //设置自定义登陆页面
    bean.setLoginUrl("/toLogin");
    //设置未授权页面
    bean.setUnauthorizedUrl("/unAuth");
    return bean;

    }

    //DefaultWebSecurityManager 2
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    //中间商,关联管理UserRealm
    securityManager.setRealm(userRealm);
    return securityManager;
    }
    //创建 realm 对象,需要自定义对象 1
    @Bean
    public UserRealm userRealm(){
    return new UserRealm();
    }

    //整合ShiroDialect:用来整合 shiro thymeleaf
    @Bean
    public ShiroDialect getShiroDialect(){
    return new ShiroDialect();
    }

    }
  • 创建一个继承AuthorizingRealm的UserRealm类,用途:认证登陆信息。

public class UserRealm extends AuthorizingRealm {

    //授权与认证
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了=>授权doGetAuthorizationInfo");
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了=>认证doGetAuthorizationInfo");

        //认证操作:用户名,密码
        String username="root";
        String password="123";

        UsernamePasswordToken userToken= (UsernamePasswordToken) token;
        if (!username.equals(userToken.getUsername())){
            return null;
        }

        //密码认证,shiro自己认证
        return new SimpleAuthenticationInfo("",password,"");
    }
}

认证操作

  • shiro规则配置类中指定权限

//授权信息配置
filterMap.put("/user/*","perms[user:add]");//表示一个user用户,有add权限
  • UserRealm(验证规则配置)类中,认证方法new SimpleAuthenticationInfo( principle,,)principle传入后端获取的user对象
@Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行了=>认证doGetAuthorizationInfo");

        //根据前端获取的用户名,密码,认证登陆
        User user = new User("root", "123", "12", "user:add");//模拟从数据库中获取用户信息
        String username="root";
        String password="123";

        //获取前端获取的用户和密码
        UsernamePasswordToken userToken= (UsernamePasswordToken) token;
        if (!username.equals(userToken.getUsername())){
            return null;
        }

        //登陆成功后,将user保存到session中
        Subject currentSubject = SecurityUtils.getSubject();
        Session session = currentSubject.getSession();
        session.setAttribute("username",user.getName());
        //密码认证,shiro自己认证
        return new SimpleAuthenticationInfo(user,password,"");
    }

 

上一篇:Qt数据库应用10-通用数据库设置


下一篇:mysql引擎