dashboard: Improve support for customizing auth-related implementations (#2059)
* refactor(dashboard): use AuthConfiguration to manage the bean of auth * refactor(dashboard): change AuthorizationInterceptor to an interface * refactor(dashboard): change LoginAuthenticationFilter to an interface * refactor(dashboard): use AuthProperties to manage auth config * test(dashboard): use NoAuthConfigurationTest to create no auth configuration for testing
This commit is contained in:
parent
4aaf8e9093
commit
069f6182ab
|
|
@ -15,58 +15,15 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.dashboard.auth;
|
package com.alibaba.csp.sentinel.dashboard.auth;
|
||||||
|
|
||||||
import com.alibaba.csp.sentinel.dashboard.domain.Result;
|
|
||||||
import com.alibaba.fastjson.JSON;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.method.HandlerMethod;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The web interceptor for privilege-based authorization.
|
* The web interceptor for privilege-based authorization.
|
||||||
*
|
*
|
||||||
* @author lkxiaolou
|
* @author lkxiaolou
|
||||||
|
* @author wxq
|
||||||
* @since 1.7.1
|
* @since 1.7.1
|
||||||
*/
|
*/
|
||||||
@Component
|
public interface AuthorizationInterceptor extends HandlerInterceptor {
|
||||||
public class AuthorizationInterceptor implements HandlerInterceptor {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private AuthService<HttpServletRequest> authService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
|
||||||
throws Exception {
|
|
||||||
if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {
|
|
||||||
Method method = ((HandlerMethod) handler).getMethod();
|
|
||||||
|
|
||||||
AuthAction authAction = method.getAnnotation(AuthAction.class);
|
|
||||||
if (authAction != null) {
|
|
||||||
AuthService.AuthUser authUser = authService.getAuthUser(request);
|
|
||||||
if (authUser == null) {
|
|
||||||
responseNoPrivilegeMsg(response, authAction.message());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
String target = request.getParameter(authAction.targetName());
|
|
||||||
|
|
||||||
if (!authUser.authTarget(target, authAction.value())) {
|
|
||||||
responseNoPrivilegeMsg(response, authAction.message());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void responseNoPrivilegeMsg(HttpServletResponse response, String message) throws IOException {
|
|
||||||
Result result = Result.ofFail(-1, message);
|
|
||||||
response.addHeader("Content-Type", "application/json;charset=UTF-8");
|
|
||||||
response.getOutputStream().write(JSON.toJSONBytes(result));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.csp.sentinel.dashboard.auth;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.dashboard.domain.Result;
|
||||||
|
import com.alibaba.fastjson.JSON;
|
||||||
|
import org.springframework.web.method.HandlerMethod;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The web interceptor for privilege-based authorization.
|
||||||
|
* <p>
|
||||||
|
* move from old {@link AuthorizationInterceptor}.
|
||||||
|
*
|
||||||
|
* @author lkxiaolou
|
||||||
|
* @author wxq
|
||||||
|
* @since 1.7.1
|
||||||
|
*/
|
||||||
|
public class DefaultAuthorizationInterceptor implements AuthorizationInterceptor {
|
||||||
|
|
||||||
|
private final AuthService<HttpServletRequest> authService;
|
||||||
|
|
||||||
|
public DefaultAuthorizationInterceptor(AuthService<HttpServletRequest> authService) {
|
||||||
|
this.authService = authService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
|
||||||
|
throws Exception {
|
||||||
|
if (handler.getClass().isAssignableFrom(HandlerMethod.class)) {
|
||||||
|
Method method = ((HandlerMethod) handler).getMethod();
|
||||||
|
|
||||||
|
AuthAction authAction = method.getAnnotation(AuthAction.class);
|
||||||
|
if (authAction != null) {
|
||||||
|
AuthService.AuthUser authUser = authService.getAuthUser(request);
|
||||||
|
if (authUser == null) {
|
||||||
|
responseNoPrivilegeMsg(response, authAction.message());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String target = request.getParameter(authAction.targetName());
|
||||||
|
|
||||||
|
if (!authUser.authTarget(target, authAction.value())) {
|
||||||
|
responseNoPrivilegeMsg(response, authAction.message());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void responseNoPrivilegeMsg(HttpServletResponse response, String message) throws IOException {
|
||||||
|
Result result = Result.ofFail(-1, message);
|
||||||
|
response.addHeader("Content-Type", "application/json;charset=UTF-8");
|
||||||
|
response.getOutputStream().write(JSON.toJSONBytes(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.csp.sentinel.dashboard.auth;
|
||||||
|
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.http.HttpStatus;
|
||||||
|
import org.springframework.util.AntPathMatcher;
|
||||||
|
|
||||||
|
import javax.servlet.*;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>The Servlet filter for authentication.</p>
|
||||||
|
*
|
||||||
|
* <p>Note: some urls are excluded as they needn't auth, such as:</p>
|
||||||
|
* <ul>
|
||||||
|
* <li>index url: {@code /}</li>
|
||||||
|
* <li>authentication request url: {@code /login}, {@code /logout}</li>
|
||||||
|
* <li>machine registry: {@code /registry/machine}</li>
|
||||||
|
* <li>static resources</li>
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
* The excluded urls and urlSuffixes could be configured in {@code application.properties} file.
|
||||||
|
*
|
||||||
|
* @author cdfive
|
||||||
|
* @since 1.6.0
|
||||||
|
*/
|
||||||
|
public class DefaultLoginAuthenticationFilter implements LoginAuthenticationFilter {
|
||||||
|
|
||||||
|
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
|
||||||
|
|
||||||
|
private static final String URL_SUFFIX_DOT = ".";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some urls which needn't auth, such as /auth/login, /registry/machine and so on.
|
||||||
|
*/
|
||||||
|
@Value("#{'${auth.filter.exclude-urls}'.split(',')}")
|
||||||
|
private List<String> authFilterExcludeUrls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some urls with suffixes which needn't auth, such as htm, html, js and so on.
|
||||||
|
*/
|
||||||
|
@Value("#{'${auth.filter.exclude-url-suffixes}'.split(',')}")
|
||||||
|
private List<String> authFilterExcludeUrlSuffixes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Authentication using AuthService interface.
|
||||||
|
*/
|
||||||
|
private final AuthService<HttpServletRequest> authService;
|
||||||
|
|
||||||
|
public DefaultLoginAuthenticationFilter(AuthService<HttpServletRequest> authService) {
|
||||||
|
this.authService = authService;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
||||||
|
throws IOException, ServletException {
|
||||||
|
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
||||||
|
|
||||||
|
String servletPath = httpRequest.getServletPath();
|
||||||
|
|
||||||
|
// Exclude the urls which needn't auth
|
||||||
|
boolean authFilterExcludeMatch = authFilterExcludeUrls.stream()
|
||||||
|
.anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath));
|
||||||
|
if (authFilterExcludeMatch) {
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exclude the urls with suffixes which needn't auth
|
||||||
|
for (String authFilterExcludeUrlSuffix : authFilterExcludeUrlSuffixes) {
|
||||||
|
if (StringUtils.isBlank(authFilterExcludeUrlSuffix)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add . for url suffix so that we needn't add . in property file
|
||||||
|
if (!authFilterExcludeUrlSuffix.startsWith(URL_SUFFIX_DOT)) {
|
||||||
|
authFilterExcludeUrlSuffix = URL_SUFFIX_DOT + authFilterExcludeUrlSuffix;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (servletPath.endsWith(authFilterExcludeUrlSuffix)) {
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthService.AuthUser authUser = authService.getAuthUser(httpRequest);
|
||||||
|
|
||||||
|
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
||||||
|
if (authUser == null) {
|
||||||
|
// If auth fail, set response status code to 401
|
||||||
|
httpResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
|
||||||
|
} else {
|
||||||
|
chain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,9 +15,10 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.dashboard.auth;
|
package com.alibaba.csp.sentinel.dashboard.auth;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import org.springframework.stereotype.Component;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A fake AuthService implementation, which will pass all user auth checking.
|
* A fake AuthService implementation, which will pass all user auth checking.
|
||||||
|
|
@ -25,9 +26,14 @@ import org.springframework.stereotype.Component;
|
||||||
* @author Carpenter Lee
|
* @author Carpenter Lee
|
||||||
* @since 1.5.0
|
* @since 1.5.0
|
||||||
*/
|
*/
|
||||||
@Component
|
|
||||||
public class FakeAuthServiceImpl implements AuthService<HttpServletRequest> {
|
public class FakeAuthServiceImpl implements AuthService<HttpServletRequest> {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
|
public FakeAuthServiceImpl() {
|
||||||
|
this.logger.warn("there is no auth, use {} by implementation {}", AuthService.class, this.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AuthUser getAuthUser(HttpServletRequest request) {
|
public AuthUser getAuthUser(HttpServletRequest request) {
|
||||||
return new AuthUserImpl();
|
return new AuthUserImpl();
|
||||||
|
|
|
||||||
|
|
@ -15,23 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.dashboard.auth;
|
package com.alibaba.csp.sentinel.dashboard.auth;
|
||||||
|
|
||||||
import org.apache.commons.lang.StringUtils;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.util.AntPathMatcher;
|
|
||||||
|
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
import javax.servlet.FilterChain;
|
|
||||||
import javax.servlet.FilterConfig;
|
|
||||||
import javax.servlet.ServletException;
|
|
||||||
import javax.servlet.ServletRequest;
|
|
||||||
import javax.servlet.ServletResponse;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>The Servlet filter for authentication.</p>
|
* <p>The Servlet filter for authentication.</p>
|
||||||
|
|
@ -43,87 +27,13 @@ import java.util.List;
|
||||||
* <li>machine registry: {@code /registry/machine}</li>
|
* <li>machine registry: {@code /registry/machine}</li>
|
||||||
* <li>static resources</li>
|
* <li>static resources</li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
* <p>
|
||||||
* The excluded urls and urlSuffixes could be configured in {@code application.properties} file.
|
* The excluded urls and urlSuffixes could be configured in {@code application.properties} file.
|
||||||
*
|
*
|
||||||
* @author cdfive
|
* @author cdfive
|
||||||
|
* @author wxq
|
||||||
* @since 1.6.0
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
@Component
|
public interface LoginAuthenticationFilter extends Filter {
|
||||||
public class LoginAuthenticationFilter implements Filter {
|
|
||||||
|
|
||||||
private static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
|
|
||||||
|
|
||||||
private static final String URL_SUFFIX_DOT = ".";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some urls which needn't auth, such as /auth/login, /registry/machine and so on.
|
|
||||||
*/
|
|
||||||
@Value("#{'${auth.filter.exclude-urls}'.split(',')}")
|
|
||||||
private List<String> authFilterExcludeUrls;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Some urls with suffixes which needn't auth, such as htm, html, js and so on.
|
|
||||||
*/
|
|
||||||
@Value("#{'${auth.filter.exclude-url-suffixes}'.split(',')}")
|
|
||||||
private List<String> authFilterExcludeUrlSuffixes;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Authentication using AuthService interface.
|
|
||||||
*/
|
|
||||||
@Autowired
|
|
||||||
private AuthService<HttpServletRequest> authService;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void init(FilterConfig filterConfig) throws ServletException {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
|
||||||
throws IOException, ServletException {
|
|
||||||
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
|
||||||
|
|
||||||
String servletPath = httpRequest.getServletPath();
|
|
||||||
|
|
||||||
// Exclude the urls which needn't auth
|
|
||||||
boolean authFilterExcludeMatch = authFilterExcludeUrls.stream()
|
|
||||||
.anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath));
|
|
||||||
if (authFilterExcludeMatch) {
|
|
||||||
chain.doFilter(request, response);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Exclude the urls with suffixes which needn't auth
|
|
||||||
for (String authFilterExcludeUrlSuffix : authFilterExcludeUrlSuffixes) {
|
|
||||||
if (StringUtils.isBlank(authFilterExcludeUrlSuffix)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add . for url suffix so that we needn't add . in property file
|
|
||||||
if (!authFilterExcludeUrlSuffix.startsWith(URL_SUFFIX_DOT)) {
|
|
||||||
authFilterExcludeUrlSuffix = URL_SUFFIX_DOT + authFilterExcludeUrlSuffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (servletPath.endsWith(authFilterExcludeUrlSuffix)) {
|
|
||||||
chain.doFilter(request, response);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
AuthService.AuthUser authUser = authService.getAuthUser(httpRequest);
|
|
||||||
|
|
||||||
HttpServletResponse httpResponse = (HttpServletResponse) response;
|
|
||||||
if (authUser == null) {
|
|
||||||
// If auth fail, set response status code to 401
|
|
||||||
httpResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
|
|
||||||
} else {
|
|
||||||
chain.doFilter(request, response);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void destroy() {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,10 +15,6 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.dashboard.auth;
|
package com.alibaba.csp.sentinel.dashboard.auth;
|
||||||
|
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
||||||
import org.springframework.context.annotation.Primary;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpSession;
|
import javax.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
|
@ -26,9 +22,6 @@ import javax.servlet.http.HttpSession;
|
||||||
* @author cdfive
|
* @author cdfive
|
||||||
* @since 1.6.0
|
* @since 1.6.0
|
||||||
*/
|
*/
|
||||||
@Component
|
|
||||||
@Primary
|
|
||||||
@ConditionalOnProperty(name = "auth.enabled", matchIfMissing = true)
|
|
||||||
public class SimpleWebAuthServiceImpl implements AuthService<HttpServletRequest> {
|
public class SimpleWebAuthServiceImpl implements AuthService<HttpServletRequest> {
|
||||||
|
|
||||||
public static final String WEB_SESSION_KEY = "session_sentinel_admin";
|
public static final String WEB_SESSION_KEY = "session_sentinel_admin";
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.csp.sentinel.dashboard.config;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.dashboard.auth.*;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableConfigurationProperties(AuthProperties.class)
|
||||||
|
public class AuthConfiguration {
|
||||||
|
|
||||||
|
private final AuthProperties authProperties;
|
||||||
|
|
||||||
|
public AuthConfiguration(AuthProperties authProperties) {
|
||||||
|
this.authProperties = authProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
public AuthService<HttpServletRequest> httpServletRequestAuthService() {
|
||||||
|
if (this.authProperties.isEnabled()) {
|
||||||
|
return new SimpleWebAuthServiceImpl();
|
||||||
|
}
|
||||||
|
return new FakeAuthServiceImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
public LoginAuthenticationFilter loginAuthenticationFilter(AuthService<HttpServletRequest> httpServletRequestAuthService) {
|
||||||
|
return new DefaultLoginAuthenticationFilter(httpServletRequestAuthService);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConditionalOnMissingBean
|
||||||
|
public AuthorizationInterceptor authorizationInterceptor(AuthService<HttpServletRequest> httpServletRequestAuthService) {
|
||||||
|
return new DefaultAuthorizationInterceptor(httpServletRequestAuthService);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.csp.sentinel.dashboard.config;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
@ConfigurationProperties(prefix = "auth")
|
||||||
|
public class AuthProperties {
|
||||||
|
|
||||||
|
private boolean enabled = true;
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(boolean enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright 1999-2018 Alibaba Group Holding Ltd.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package com.alibaba.csp.sentinel.dashboard.config;
|
||||||
|
|
||||||
|
import com.alibaba.csp.sentinel.dashboard.auth.AuthService;
|
||||||
|
import com.alibaba.csp.sentinel.dashboard.auth.FakeAuthServiceImpl;
|
||||||
|
import org.springframework.boot.test.context.TestConfiguration;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Import;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* disable auth in test.
|
||||||
|
*
|
||||||
|
* @author wxq
|
||||||
|
*/
|
||||||
|
@TestConfiguration
|
||||||
|
@Import(AuthConfiguration.class)
|
||||||
|
public class NoAuthConfigurationTest {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public AuthService<HttpServletRequest> httpServletRequestAuthService() {
|
||||||
|
return new FakeAuthServiceImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -15,9 +15,8 @@
|
||||||
*/
|
*/
|
||||||
package com.alibaba.csp.sentinel.dashboard.controller.gateway;
|
package com.alibaba.csp.sentinel.dashboard.controller.gateway;
|
||||||
|
|
||||||
import com.alibaba.csp.sentinel.dashboard.auth.AuthorizationInterceptor;
|
|
||||||
import com.alibaba.csp.sentinel.dashboard.auth.FakeAuthServiceImpl;
|
|
||||||
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
|
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
|
||||||
|
import com.alibaba.csp.sentinel.dashboard.config.NoAuthConfigurationTest;
|
||||||
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;
|
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity;
|
||||||
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiPredicateItemEntity;
|
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiPredicateItemEntity;
|
||||||
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
|
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
|
||||||
|
|
@ -61,7 +60,7 @@ import static org.mockito.BDDMockito.*;
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@WebMvcTest(GatewayApiController.class)
|
@WebMvcTest(GatewayApiController.class)
|
||||||
@Import({FakeAuthServiceImpl.class, InMemApiDefinitionStore.class, AppManagement.class, SimpleMachineDiscovery.class, AuthorizationInterceptor.class})
|
@Import({NoAuthConfigurationTest.class, InMemApiDefinitionStore.class, AppManagement.class, SimpleMachineDiscovery.class})
|
||||||
public class GatewayApiControllerTest {
|
public class GatewayApiControllerTest {
|
||||||
|
|
||||||
private static final String TEST_APP = "test_app";
|
private static final String TEST_APP = "test_app";
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ package com.alibaba.csp.sentinel.dashboard.controller.gateway;
|
||||||
import com.alibaba.csp.sentinel.dashboard.auth.AuthorizationInterceptor;
|
import com.alibaba.csp.sentinel.dashboard.auth.AuthorizationInterceptor;
|
||||||
import com.alibaba.csp.sentinel.dashboard.auth.FakeAuthServiceImpl;
|
import com.alibaba.csp.sentinel.dashboard.auth.FakeAuthServiceImpl;
|
||||||
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
|
import com.alibaba.csp.sentinel.dashboard.client.SentinelApiClient;
|
||||||
|
import com.alibaba.csp.sentinel.dashboard.config.NoAuthConfigurationTest;
|
||||||
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
|
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayFlowRuleEntity;
|
||||||
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayParamFlowItemEntity;
|
import com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.GatewayParamFlowItemEntity;
|
||||||
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
|
import com.alibaba.csp.sentinel.dashboard.discovery.AppManagement;
|
||||||
|
|
@ -64,8 +65,7 @@ import static org.mockito.BDDMockito.*;
|
||||||
*/
|
*/
|
||||||
@RunWith(SpringRunner.class)
|
@RunWith(SpringRunner.class)
|
||||||
@WebMvcTest(GatewayFlowRuleController.class)
|
@WebMvcTest(GatewayFlowRuleController.class)
|
||||||
@Import({FakeAuthServiceImpl.class, InMemGatewayFlowRuleStore.class, AppManagement.class, SimpleMachineDiscovery.class,
|
@Import({NoAuthConfigurationTest.class, InMemGatewayFlowRuleStore.class, AppManagement.class, SimpleMachineDiscovery.class})
|
||||||
AuthorizationInterceptor.class })
|
|
||||||
public class GatewayFlowRuleControllerTest {
|
public class GatewayFlowRuleControllerTest {
|
||||||
|
|
||||||
private static final String TEST_APP = "test_app";
|
private static final String TEST_APP = "test_app";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue