springboot整合shiro

 创建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;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值