springboot结合shiro入门学习(二)

上一篇简单学习shiro的认证。这一篇主要是结合数据库来整合springboot和shiro

整体项目结构
在这里插入图片描述

首先我们在pom添加mybatis

 <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        

整体pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- shiro与spring整合依赖 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

    </dependencies>
        

UserMapper

//@Mapper
@Repository
public interface UserMapper {
    //登录

    public User findByUsername(String username);
   public int register(User user);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="findByUsername"   parameterType="String" resultType="com.example.pojo.User" >
    select username,password from t_login where username = #{value}
  </select>

    <!-- 添加用户 -->
    <insert id="register" parameterType="com.example.pojo.User">
		INSERT INTO t_login
			(
			username,
			password
			)
			VALUES
			(
			#{username},
			#{password}
			)
	</insert>
</mapper>

UserService

public interface UserService {

    public User findByUsername(String username);
    public boolean register(User user);
}


@Service
public class UserServiceImpl implements UserService {
    //属性注入
    @Autowired
    private UserMapper usermapper;
    public User findByUsername(String username){
        return usermapper.findByUsername(username);
    }

    @Override
    public boolean register(User user) {
         int appregister=0;
       appregister= usermapper.register(user);
      // System.out.println("appregister:"+appregister);
       if(appregister==0){
           return  false;
       }
       else {
           return true;
       }
    }
}

自定义Realm类

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

    @Autowired
    private UserService userSerivce;
    /**
     * 执行认证逻辑
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
        System.out.println("执行认证逻辑");

        //编写shiro判断逻辑,判断用户名和密码
        //1.判断用户名
        UsernamePasswordToken token = (UsernamePasswordToken)arg0;

        User user = userSerivce.findByUsername(token.getUsername());

        if(user==null){
            //用户名不存在
            return null;//shiro底层会抛出UnKnowAccountException
        }

        //2.判断密码


        return new SimpleAuthenticationInfo("",user.getPassword(),"");
    }



controller

@Controller
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/tologin")
    public String tologin(){
        return "login";
    }
    @RequestMapping("/registe")
    public String register(){
        return "registe";
    }

    @RequestMapping("/towelcome")
    public String inwelcome(){
        return "welcome";
    }
    /**
     * 登录逻辑处理
     */
    @RequestMapping("/loginsubmit")
    public String login(String username,String password,Model model){
        /**
         * 使用Shiro编写认证操作
         */
        //1.获取Subject
        Subject subject = SecurityUtils.getSubject();

        //2.封装用户数据
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);

        //3.执行登录方法
        try {
            subject.login(token);

            //登录成功
            //跳转到test.html
            return "redirect:/towelcome";
        } catch (UnknownAccountException e) {
            //e.printStackTrace();
            //登录失败:用户名不存在
            model.addAttribute("msg", "用户名不存在");
            return "login";
        }catch (IncorrectCredentialsException e) {
            //e.printStackTrace();
            //登录失败:密码错误
            model.addAttribute("msg", "密码错误");
            return "login";
        }
    }
    /**
     * 注册逻辑处理
     */
    @RequestMapping("/userRegister")
    public String toregister(String username,String password,Model model)
    {

        User user=new User();
        user.setUsername(username);
        user.setPassword(password);
       boolean addregister= userService.register(user);
       if(addregister) {
           model.addAttribute("msg", "注册成功");
       }
       else{
           model.addAttribute("msg", "注册失败");
       }
        return "registe";
    }

}



ExampleApplication


@MapperScan("com.example.mapper")
@SpringBootApplication
@EnableTransactionManagement//启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />
public class ExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

}


**Shiro配置类(*)**基本上跟上一篇一样,就增加了注册认证 filterMap.put("/userRegister", “anon”);

@Configuration
public class ShiroConfig {

    /**
     * 创建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>();

        filterMap.put("/static/**", "anon");
        filterMap.put("/tologin", "anon");
        filterMap.put("/loginsubmit", "anon");
        filterMap.put("/registe", "anon");
        filterMap.put("/userRegister", "anon");
        filterMap.put("/*", "authc");

        //修改调整的登录页面
        shiroFilterFactoryBean.setLoginUrl("/tologin");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);


        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();
    }
}

好了到这里就完成与数据库的整合,下一篇会介绍shiro权限管理和加密认证的过程。
源码地址:https://gitee.com/jzzhu123456/shiroHouse_asd
下一篇:springboot结合shiro入门学习(三)

发布了21 篇原创文章 · 获赞 9 · 访问量 4511

猜你喜欢

转载自blog.csdn.net/qq_36470898/article/details/97549766
今日推荐