创建springboot工程
添加shiro依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.7.0</version>
</dependency>
添加配置文件
#数据源
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
创建自定义的Relam
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
return null;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
return null;
}
}
创建过滤器
public class Myfilter extends FormAuthenticationFilter {
@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(3000,"未登录",null);
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(commonResult);
writer.print(json);
writer.flush();
writer.close();
return false;
}
}
创建配置类
springboot的配置类相当于spring的.xml配置文件
配置shiro管理器
@Configuration
public class ShiroConfig {
/*配置shiro管理器*/
@Bean
public DefaultWebSecurityManager securityManager(){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
/*设置读取的自定义的relam*/
defaultWebSecurityManager.setRealm(realm());
return defaultWebSecurityManager;
}
/*创建realm配置自定义的relam*/
@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","anon");
map.put("/**","authc");
factoryBean.setFilterChainDefinitionMap(map);
//设置自定义认证过滤器
HashMap<String,Filter> filterMap=new HashMap<String, Filter>();
filterMap.put("authc",new Myfilter());
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;
}
}
创建controller层
@RestController
public class LoginCon {
@PostMapping(value = "/login")
@ResponseBody
public CommonResult login(String username, String userpwd){
/*subject里封装了当前用户所具有的权限*/
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username,userpwd);
try{
subject.login(token);
subject.isPermitted("user:query");
/*redirect: 页面重定向 不加是请求转发*/
return new CommonResult(2000,"登陆成功",null);
}catch (Exception e){
return new CommonResult(5000,"失败",null);
}
}
}
service层
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User findByUsername(String username) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username",username);
User user = userMapper.selectOne(wrapper);
return user;
}
public List<String> findPerByuserid(Integer userid) {
List<String> list = userMapper.selByUserId(userid);
return list;
}
}
dao层
@Mapper
public interface UserMapper extends BaseMapper<User> {
/*根据用户id查询用户权限*/
@Select("select percode from user_role ur join role_permission rp on ur.roleid=rp.roleid join permission p on rp.perid=p.perid where ur.userid=#{userid}")
List<String> selByUserId(Integer userid);
}
错误:
解决:
错误2
需要在配置类中开启shiro注解
//开启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;
}
放行swagger
修改配置类
/*创建过滤器*/
@Bean(value = "shiroFilter")
public ShiroFilterFactoryBean filterFactoryBean(){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager());
//设置拦截规则
HashMap<String,String> map=new HashMap<>();
map.put("/login","anon");
map.put("/**","authc");
//放行Swagger2页面,需要放行这些
map.put("/swagger-ui.html","anon");
map.put("/swagger/**","anon");
map.put("/webjars/**", "anon");
map.put("/swagger-resources/**","anon");
map.put("/v2/**","anon");
map.put("/static/**", "anon");
map.put("/doc.html","anon");
map.put("/swagger2/**", "anon");
factoryBean.setFilterChainDefinitionMap(map);
//设置自定义认证过滤器
HashMap<String,Filter> filterMap=new HashMap<String, Filter>();
filterMap.put("authc",new Myfilter());
factoryBean.setFilters(filterMap);
return factoryBean;
}