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"; } } }