Loading

shiro登录认证及拦截

引入shiro相关依赖

<!-- shiro -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

编写shiro工具类

package com.org.gateway.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 OuYangFL
 * @Date 2022/8/10 9:52 上午
 */

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager")
                                                            DefaultWebSecurityManager securityManager){

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/user/toLogin", "anon");
        filterMap.put("/user/login", "anon");
        filterMap.put("/user/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        shiroFilterFactoryBean.setLoginUrl("/user/toLogin");
        shiroFilterFactoryBean.setSuccessUrl("/user/login");
        return shiroFilterFactoryBean;

    }

    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(@Qualifier("getShiroRealm") ShiroRealm shiroRealm){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        defaultWebSecurityManager.setRealm(shiroRealm);
        return defaultWebSecurityManager;
    }

    @Bean
    public ShiroRealm getShiroRealm(){
        return new ShiroRealm();
    }
}

编写ShiroRealm类,用于认证

package com.org.gateway.config;

import com.org.gateway.service.UserPermissionsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;

import javax.annotation.Resource;

/**
 * @Author OuYangFL
 * @Date 2022/8/10 12:06 上午
 */
@Slf4j
public class ShiroRealm extends AuthorizingRealm {

    @Resource
    UserPermissionsService userPermissionsService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        log.info("执行==》 授权 doGetAuthorizationInfo");
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        log.info("执行==》 认证 doGetAuthenticationInfo");
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) authenticationToken;
        log.info(usernamePasswordToken.getUsername());
        log.info(String.valueOf(usernamePasswordToken.getPassword()));

        //获取数据库中密码
        String password = userPermissionsService.queryUserPermissionByName(usernamePasswordToken.getUsername());
        log.info(String.valueOf(usernamePasswordToken.getPassword()));
        log.info("password:"+password);
        if (password == null) {
            return null;
        }
        Subject subject = SecurityUtils.getSubject();
        subject.getSession().setAttribute("user", password);

        return new SimpleAuthenticationInfo(usernamePasswordToken.getUsername(), password, "");
    }

}

编写controller类

package com.org.gateway.controller;
import com.alibaba.druid.pool.DruidDataSource;
import com.org.gateway.service.UserPermissionsService;
import com.org.gateway.utils.MD5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;


import javax.annotation.Resource;


@Slf4j
@Controller
@RequestMapping("/user")
public class LoginController {

    @Autowired
    public UserPermissionsService userPermissionsService;

    @RequestMapping(value = "/toLogin", method = RequestMethod.GET)
    public String index(){
        return "login";
    }

    @RequestMapping(value = "/login", method = {RequestMethod.POST, RequestMethod.GET})
    public String login(@RequestParam(required = false) String username,
                      @RequestParam(required = false) String password,
                        Model model){
        //获取当前用户
        Subject subject = SecurityUtils.getSubject();
        log.info("subject"+subject);
        //
        UsernamePasswordToken token = new UsernamePasswordToken(username,MD5Util.MD5(password));
        log.info("token值:"+ token);
        try {
            subject.login(token);
            model.addAttribute("username", username);
            model.addAttribute("password", password);
            return "success";
        }catch (UnknownAccountException e){
            model.addAttribute("message","用户名错误");
            return "login";
        }catch (IncorrectCredentialsException e){
            model.addAttribute("message","密码错误");
            return "login";
        }catch (AuthenticationException e){
            model.addAttribute("message","必须登录才可以查看");
            return "login";
        }
    }
}

 

posted @ 2022-08-10 22:30  -Heart-  阅读(224)  评论(0)    收藏  举报