Spring Boot - Filter实现简单的Http Basic认证

Copy自http://blog.csdn.net/sun_t89/article/details/51916834

@SpringBootApplication
public class SpringRestApplication { 
public static void main(String[] args) { 
        SpringApplication.run(SpringRestApplication.class, args); 
    } 
@Bean
public FilterRegistrationBean  filterRegistrationBean() { 
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
        HTTPBasicAuthorizeAttribute httpBasicFilter = new HTTPBasicAuthorizeAttribute(); 
        registrationBean.setFilter(httpBasicFilter); 
        List<String> urlPatterns = new ArrayList<String>(); 
        urlPatterns.add("/user/*"); 
        registrationBean.setUrlPatterns(urlPatterns); 
return registrationBean; 
    } 

public class HTTPBasicAuthorizeAttribute implements Filter{
    private static String Name = "test";
    private static String Password = "test";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
       
        ResultStatusCode resultStatusCode = checkHTTPBasicAuthorize(request);
        if (resultStatusCode != ResultStatusCode.OK)
        {
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            httpResponse.setCharacterEncoding("UTF-8"); 
            httpResponse.setContentType("application/json; charset=utf-8");
            httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

            ObjectMapper mapper = new ObjectMapper();
           
            ResultMsg resultMsg = new ResultMsg(ResultStatusCode.PERMISSION_DENIED.getErrcode(), ResultStatusCode.PERMISSION_DENIED.getErrmsg(), null);
            httpResponse.getWriter().write(mapper.writeValueAsString(resultMsg));
            return;
        }
        else
        {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub       
    }   

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }


    private ResultStatusCode checkHTTPBasicAuthorize(ServletRequest request)
    {
        try
        {
            HttpServletRequest httpRequest = (HttpServletRequest)request;
            String auth = httpRequest.getHeader("Authorization");
            if ((auth != null) && (auth.length() > 6))
            {
                String HeadStr = auth.substring(0, 5).toLowerCase();
                if (HeadStr.compareTo("basic") == 0)
                {
                    auth = auth.substring(6, auth.length()); 
                    String decodedAuth = getFromBASE64(auth);
                    if (decodedAuth != null)
                    {
                        String[] UserArray = decodedAuth.split(":");
                       
                        if (UserArray != null && UserArray.length == 2)
                        {
                            if (UserArray[0].compareTo(Name) == 0
                                    && UserArray[1].compareTo(Password) == 0)
                            {
                                return ResultStatusCode.OK;
                            }
                        }
                    }
                }
            }
            return ResultStatusCode.PERMISSION_DENIED;
        }
        catch(Exception ex)
        {
            return ResultStatusCode.PERMISSION_DENIED;
        }       
    }
   
    private String getFromBASE64(String s) { 
        if (s == null) 
            return null; 
        BASE64Decoder decoder = new BASE64Decoder(); 
        try { 
            byte[] b = decoder.decodeBuffer(s); 
            return new String(b); 
        } catch (Exception e) { 
            return null; 
        } 
    }

转载于:https://www.cnblogs.com/teamleader/p/6505933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security中,自动刷新令牌通常涉及到使用JWT(JSON Web Tokens)作为身份验证机制,以及一个适当的刷新令牌策略。以下是一般的步骤: 1. 添加依赖:首先,在你的`pom.xml`或`build.gradle`文件中添加Spring Security JWT和相关库的依赖。 ```xml <!-- Maven --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> </dependency> <!-- Gradle (Gradle Plugin) --> implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.jsonwebtoken:jjwt-api' implementation 'io.jsonwebtoken:jjwt-impl:0.9.1' // 实际版本可能根据项目需求不同 ``` 2. 配置JWT:创建一个JWTTokenProvider,并在SecurityConfig中设置JWT相关的属性,如过期时间(access_token过期时间和refresh_token过期时间)和签发者。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private JwtTokenProvider jwtTokenProvider; @Bean public JwtAuthenticationProvider jwtAuthenticationProvider() { JwtAuthenticationProvider provider = new JwtAuthenticationProvider(jwtTokenProvider); provider.setJwtIdClaimName("sub"); return provider; } @Bean public JwtTokenProvider jwtTokenProvider() { return new JwtTokenProvider(); } @Override protected void configure(HttpSecurity http) throws Exception { // 更多的Security配置... http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .httpBasic().disable() .cors().disable() .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); } @Bean public FilterRegistrationBean jwtAuthenticationFilter() { JwtAuthenticationFilter filter = new JwtAuthenticationFilter(authenticationManager()); filter.setTokenEnhancer(tokenEnhancer()); return new FilterRegistrationBean<>(filter); } private TokenEnhancer tokenEnhancer() { return accessToken -> { // 在这里处理token刷新逻辑,如果需要自动刷新,可以在适当时候创建新的refresh_token // 如果刷新令牌可用并且未过期,返回新的access_token // ... return accessToken; }; } } ``` 3. 刷新令牌策略:在`tokenEnhancer()`方法中,你可以检查当前的refresh_token是否有效并可以用来获取新的access_token。你可以选择一个策略,比如定期刷新(基于时间)或在access_token用尽之前刷新。 4. 使用刷新令牌:在API调用中,当用户访问受保护的资源且他们的access_token已过期时,后端服务器会检查是否有有效的refresh_token。如果有,将使用refresh_token通过JWT服务生成新的access_token并更新客户端的token缓存。 相关问题: 1. Spring Security中的JWT刷新令牌是如何工作的? 2. 如何在`tokenEnhancer()`中实现自动刷新策略? 3. 刷新令牌的存储通常在哪里?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值