public class MyRealm extends AuthorizingRealm { @Autowired private LoginService loginService; //授权 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { User user = (User) principalCollection.getPrimaryPrincipal(); //根据该账号查询用户有哪些权限 List<String> primary = loginService.findPrimaryById(user.getUserid()); System.out.println(primary); if(primary!=null&&primary.size()>0){ SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); info.addStringPermissions(primary); return info; } return null; } //认证 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { String user = (String) authenticationToken.getPrincipal(); User byName = loginService.findByName(user); if(byName!=null){ ByteSource source = ByteSource.Util.bytes(byName.getSalt()); SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(byName,byName.getUserpwd(),source,this.getName()); return info; } return null; } }
@RestController @RequestMapping("/login") public class LoginController { @Autowired private LoginService loginService; @GetMapping("/upLogin") public CommonResult upLogin(String username,String password){ Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token=new UsernamePasswordToken(username,password); try{ subject.login(token); return new CommonResult(200,"登陆成功",null); }catch (Exception e){ e.printStackTrace(); return new CommonResult(500,"登陆失败",null); } } }
加密
public class LoginFilter extends FormAuthenticationFilter {
//当没有登录时会经过该方法。如果想让他返回json数据那么必须重写该方法
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
response.setContentType("application/json;charset=utf-8");
PrintWriter writer=response.getWriter();
CommonResult commonResult=new CommonResult(4001,"未登录",null);
ObjectMapper objectMapper=new ObjectMapper();
String json = objectMapper.writeValueAsString(commonResult);
writer.print(json);//响应给客户json数据
writer.flush();
writer.close();
return false;
}
}
shiro
@Configuration public class ShiroConfig { @Bean public DefaultWebSecurityManager securityManager(){ DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager(); securityManager.setRealm(realm()); return securityManager; } @Bean public Realm realm(){ MyRealm myRealm=new MyRealm(); myRealm.setCredentialsMatcher(credentialsMatcher()); return myRealm; } @Bean public CredentialsMatcher credentialsMatcher(){ HashedCredentialsMatcher credentialsMatcher=new HashedCredentialsMatcher(); credentialsMatcher.setHashAlgorithmName("MD5"); credentialsMatcher.setHashIterations(1024); return credentialsMatcher; } @Bean(value = "shiroFilter") public ShiroFilterFactoryBean filterFactoryBean(){ ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); factoryBean.setSecurityManager(securityManager()); //设置拦截规则 HashMap<String,String> map=new HashMap<>(); map.put("/login/upLogin","anon"); map.put("/**/*.css","anon"); map.put("/**/*.js","anon"); map.put("/doc.html","anon"); map.put("/swagger-resources","anon"); map.put("/v2/api-docs","anon"); map.put("/**","authc"); factoryBean.setFilterChainDefinitionMap(map); //设置自定义认证过滤器 HashMap<String, Filter> filterMap=new HashMap<String, Filter>(); filterMap.put("authc",new LoginFilter()); factoryBean.setFilters(filterMap); return factoryBean; } @Bean //注册filter public FilterRegistrationBean<Filter> filterRegistrationBean(){ FilterRegistrationBean<Filter> filterRegistrationBean=new FilterRegistrationBean<>(); filterRegistrationBean.setName("shiroFilter"); filterRegistrationBean.setFilter(new DelegatingFilterProxy()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } //开始shiro注解 @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager()); return authorizationAttributeSourceAdvisor; } @Bean public DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator(); advisorAutoProxyCreator.setProxyTargetClass(true); return advisorAutoProxyCreator; } }
application配置文件
#数据源
spring.datasource.url=jdbc:mysql://localhost:3306/shiro?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#端口号
server.port=8808
#sql日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
@Configuration public class SwaggerConfig { @Bean//swagger中所有的功能都封装在Docket类中 public Docket docket(){ Docket docket=new Docket(DocumentationType.SWAGGER_2) .host("localhost:8808") .apiInfo(apiInfo())//设置api文档信息 .select() .apis(RequestHandlerSelectors.basePackage("com.qy151wd.controller")) .build(); return docket; } //定义自己接口文档信息 private ApiInfo apiInfo(){ Contact DEFAULT_CONTACT = new Contact("小可", "http://www.baidu.com", "[email protected]"); ApiInfo apiInfo = new ApiInfo("萌萌的小项目", "适合小新手", "V1.0", "http://www.jd.com", DEFAULT_CONTACT, "牛牛公司", "http://www.taobao.com", new ArrayList<VendorExtension>()); return apiInfo; } }