Shiro安全框架08:springboot整合shiro实现登录认证(已连接数据库)(继上一篇)

第一步:前端表单

<form action="/login" method="post">
    用户名:<input type="text" name="userName">
    密码:<input type="password" name="userPassword">
    <input type="submit" value="login">
</form>

第二步:后端controller

@RequestMapping("/login")
    public String myTranslate3(String userName,String userPassword) {
        System.out.println(userName+":"+userPassword);

        //获取用户主体subject
        Subject subject = SecurityUtils.getSubject();
        //封装用户数据  (将前端传入的数据封装成登录令牌)
        UsernamePasswordToken token = new UsernamePasswordToken(userName, userPassword);
        //指定登录方法
        try {
            //传入令牌进行登录
            subject.login(token);
        }catch (UnknownAccountException e){
            //用户名不存在
            System.out.println("用户名不存在");
        }catch (IncorrectCredentialsException e){
            System.out.println("密码错误");
            return "error";
        }

        return "index";
    }

第三步:自定义realm进行授权

public class UserRealm extends AuthorizingRealm {

    @Autowired
    UserService userService;

    /**
     * 认证
     * @param authenticationToken 令牌
     * @return 用户信息
     * @throws
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {


        UsernamePasswordToken token = (UsernamePasswordToken)authenticationToken;
        //从数据库中取出用户
        User user = userService.getUserByName(token.getUsername());
        System.out.println(user);
        //判断用户名是否存在
        if (user !=null){
            if (!token.getUsername().equals(user.getUserName())){
                //用户名不存在
                return null;
            }

            //判断密码
            return new SimpleAuthenticationInfo("",user.getUserPassword(),"");
        }else {
            return null;
        }


    }

    /**
     * 授权
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("指定了授权");
        return null;
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot整合shiro框架实现登录认证的流程及原理可以分为以下步骤: 1. 引入shiro和web依赖 在pom.xml中引入shiro和web依赖,如下所示: ```xml <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.7.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ``` 2. 配置shiro 在application.properties文件中配置shiro相关属性,如下所示: ```properties # shiro配置 # 加密算法 shiro.hashAlgorithmName=md5 # 加密次数 shiro.hashIterations=2 # shiro缓存 shiro.cacheManager=org.apache.shiro.cache.MemoryConstrainedCacheManager ``` 3. 自定义Realm 实现自定义Realm,继承org.apache.shiro.realm.AuthorizingRealm类,重写doGetAuthorizationInfo和doGetAuthenticationInfo方法,分别用于授权和认证。 ```java public class CustomRealm extends AuthorizingRealm { @Autowired private UserService userService; /** * 授权 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } /** * 认证 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token; String username = usernamePasswordToken.getUsername(); User user = userService.findByUsername(username); if (user == null) { throw new UnknownAccountException("用户名不存在"); } String password = new String(usernamePasswordToken.getPassword()); String salt = user.getSalt(); String hashedPassword = new SimpleHash("md5", password, salt, 2).toString(); if (!user.getPassword().equals(hashedPassword)) { throw new IncorrectCredentialsException("密码错误"); } SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), getName()); return authenticationInfo; } } ``` 4. 配置shiroFilterFactoryBean 在配置类中配置shiroFilterFactoryBean,用于拦截请求,并进行认证和授权。 ```java @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); filterFactoryBean.setLoginUrl("/login"); filterFactoryBean.setUnauthorizedUrl("/unauthorized"); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "authc"); filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return filterFactoryBean; } ``` 5. 配置securityManager 在配置类中配置securityManager,将自定义Realm添加到securityManager中。 ```java @Bean public DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(customRealm()); return securityManager; } ``` 6. 配置shiro的注解支持 在配置类中配置shiro的注解支持,用于在Controller中使用@RequiresRoles和@RequiresPermissions注解。 ```java @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; } ``` 7. 编写Controller 编写Controller,用于处理登录请求。 ```java @Controller public class LoginController { @GetMapping("/login") public String login() { return "login"; } @PostMapping("/login") public String doLogin(String username, String password) { Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(username, password); try { subject.login(token); return "redirect:/index"; } catch (UnknownAccountException e) { return "login"; } catch (IncorrectCredentialsException e) { return "login"; } } @GetMapping("/logout") public String logout() { Subject subject = SecurityUtils.getSubject(); subject.logout(); return "redirect:/login"; } @GetMapping("/unauthorized") public String unauthorized() { return "unauthorized"; } } ``` 以上就是SpringBoot整合shiro框架实现登录认证的流程及原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值