Spring Boot+Shrio(Java安全框架)1

1.Spring Boot 框架简介

Spring的诞生是java企业版(Java Enterprise Edition,J2EE)的轻量级代替品,无需开发重量级Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的java对象实现EJB的功能。

虽然spring的组件代码是轻量级的,但是它的配置却是重量级的。

Spring boot 简化了基于spring的应用开发,只需要”run"就能创建一个独立的、生产级别的spring应用。springboot 为spring平台及第三方库提供开箱即用的设置(提供默认配置)。

 

2.Shiro框架简介

 Apache Shiro 是一个Java安全框架,执行身份验证、授权、密码学和会话管理

Apache Shiro 体系结构:

  • Authentication  认证--------用户登录
  • Authorizaiton    授权-----用户具体有哪些权限
  • Cryptography   安全数据加密
  • Session Management 会话管理

3.Spring boot 与Shiro整合实现用户认证

 3.1 分析Shiro的核心API

Subject: 用户体(把操作交给SecurityManager)

SecurityManager: 安全管理器(关联Realm)

Realm: shiro链接数据的桥梁

3.2 Spring boot整合Shiro

3.2.1 导入shiro与spring整合依赖

修改pom.xml文件

3.2.2 自定义Real类

/**
 * 之定义Realm
 */
public class UserRealm extends AuthorizingRealm {
    /**
     * 执行授权逻辑
     *
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行授权逻辑");
        return null;
    }

    /**
     * 执行认证逻辑
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行认证逻辑");
        return null;
    }
}

3.2.3 编写shiro配置类

/**
 * shiro配置类
 */
@Configuration
public class ShiroConfig {
    /**
     * 创建ShiroFilterFactoryBean
     */
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        return shiroFilterFactoryBean;
    }

    /**
     * 创建DefaultWebSecurityManager
     */
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        //关联realm
        securityManager.setRealm(userRealm);
        return securityManager;
    }


    /**
     * 创建Realm
     */
    @Bean(name = "userRealm")
    public UserRealm getRealm(){
        return new UserRealm();
    }
}

3.2.4 使用shiro内置过滤器实现页面拦截

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.subject.PrincipalCollection;
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;

/**
 * shiro配置类
 */
@Configuration
public class ShiroConfig {
    /**
     * 创建ShiroFilterFactoryBean
     * getShiroFilterFactoryBean完成后,应该使用bean注解,
     * 把shiroFilterFactoryBean放入spring中,让spring知道创建了一个shiroFilterFactoryBean对象
     */
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //添加shiro内置过滤器
        /**
         * shiro内置过滤器,可以实现权限相关的拦截器
         *  常用的过滤器:
         *     anon:无需认证(登录)可以访问
         *     authc:必须认证才可以访问
         *     user:如果使用rememberMe的功能可以直接访问
         *     perms:该资源必须得到资源权限才可以访问
         *     role:该资源必须得到角色权限才可以访问
         */
        Map<String, String> filterMap = new LinkedHashMap<String, String>();
        /**
         *   已 "/add"开头的接口 ,使用authc过滤
         */
        filterMap.put("/add", "authc");
        filterMap.put("/update", "authc");
        //user目录下的所有都是要authc权限
//        filterMap.put("/user/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        //修改调整的登录页面
        shiroFilterFactoryBean.setLoginUrl("/toLogin");
        return shiroFilterFactoryBean;
    }

3.3 实现用户认证(登录)操作

3.3.1 编写controller的逻辑

    @RequestMapping("/login")
    public String login(String name,String password){
        /**
         * 使用shiro编写认证操作
         */
        // 1.获取Subject
        Subject subject= SecurityUtils.getSubject();
        // 2. 封装用户数据
        UsernamePasswordToken token=new UsernamePasswordToken(name,password);
        // 3.执行登录方法
        try {
            subject.login(token);//只要走login方法就会执行ShiroConfig中的DefaultWebSecurityManager方法(认证逻辑)
            //登录成功
//            跳转到test.html,redirect跳转
            return "redirect:/testThymeleaf";
        }catch (IncorrectCredentialsException e){
            e.printStackTrace();
            /**
             *          密码错误      IncorrectCredentialsException
             */
            model.addAttribute("msg","密码错误");
            return  "login";
        }catch (UnknownAccountException e){
            /**
              * 登录失败:用户名不存在   UnknownAccountException
             */
            model.addAttribute("msg","用户名不存在");
            return  "login";
        }

    }

3.3.2  编写Realm的判断逻辑

/**
 * 之定义Realm
 */
public class UserRealm extends AuthorizingRealm {
    /**
     * 执行授权逻辑
     *
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行授权逻辑");
        return null;
    }

    /**
     * 执行认证逻辑
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
        System.out.println("执行认证逻辑");
        //假设数据库的用户名和密码;
        String name="ano";
        String password="123456";
        //编写shiro判断逻辑,判断用户名和密码
//        1.判断用户名
        if(!token.getUserName().equals(name)){
//            用户名不存在
            return null;//shiro底层会抛出UnknownAccountException
        }
//        2.判断密码
        return new SimpleAuthenticationInfo("",password,"");
    }
}

4. mybatis整合

4.1导入mybatis相关依赖

4. 2 配置文件 application.properties

位置:根目录src/main/resources

参数:连接数据库的参数、 阿里连接池参数

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/yunshan?characterEncoding=utf-8&useSSL=true&useUnicode=true
spring.datasource.username=root
spring.datasource.password=123456

spring.datasource.type=com.alibaba.druid.pool.Druid

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值