2 回答

TA貢獻1805條經驗 獲得超9個贊
有沒有一種方法,我只能在我的項目中使用身份驗證部分,或者我應該使用這兩個類在 Spring Security 中設置用戶身份驗證?
不,不存在只有身份驗證部分的概念,您對 Spring Security 的看法是錯誤的,Spring Security 的全部內容都與使用默認配置或實現(xiàn)自定義配置有關。(AuthenticationFilters
、、AuthenticationProviders
等AuthenticationToken
)
Spring security 是關于身份驗證和授權的,Spring security 是通過在 web.xml 中聲明一個過濾器 DelegatingFilterProxy 來配置的(在 Spring boot 中,它將通過自動配置來完成)。
Spring 安全性在代理過濾器或 Spring 托管 bean 方面將WALL?(?HttpFireWall?)放置在您的應用程序之前。如果請求在身份驗證和授權部分都成功,則可以到達您的應用程序。
1. 身份驗證就是對用戶的身份識別。
它將經歷
驗證憑證或
驗證授權標頭內容或
驗證與請求關聯(lián)的 cookie(JSESSIONID cookie),即會話
如果以上都不匹配,則用戶被識別為匿名。
在此步驟中將Authentication
?創(chuàng)建對象。從 auth 對象你可以得到
詳細信息對象(有關身份驗證請求的其他詳細信息)
主要對象(
UserDetails
或AuthenticatedPrincipal
或Principal
)憑據(jù)(通常是密碼,但可以是與 相關的任何內容
AuthenticationManager
)授予權限的集合
和一個布爾值已驗證。
2. 授權就是訪問決策。
FilterSecurityInterceptor
過濾器鏈中幾乎最后一個會Authentication
從過濾器鏈中獲取對象SecurityContext
并獲得授予的權限列表(授予的角色),并且它將決定是否允許該請求到達所請求的資源,決定是通過與允許在HttpSecurityConfiguration
.
考慮例外情況 401-UnAuthorized 和 403-Forbidden。這些決定將在過濾器鏈的最后完成。
401-UnAuthorized:未經身份驗證的用戶嘗試訪問受保護的資源。
403-Forbidden:經過身份驗證的用戶嘗試訪問受限資源。
未經身份驗證的用戶將被允許訪問非受限資源,并且他不會收到 UnAuthorized 錯誤,但它是由為未經身份驗證的用戶AnonymousAuthenticationFilter
設置權限來處理的。ROLE_ANONYMOUS
注意
下面給出了過濾器排序。其中,
身份驗證為 @order-4
授權為 @Order-9(Last)
Spring Security有
幾個區(qū)域,您定義的模式會針對傳入請求進行測試,以便決定如何處理請求。當FilterChainProxy
決定應通過哪個過濾器鏈以及決定FilterSecurityInterceptor
對請求應用哪些安全約束時,就會發(fā)生這種情況。根據(jù)您定義的模式進行測試時,了解機制是什么以及使用什么 URL 值非常重要。
過濾器排序
過濾器在鏈中定義的順序非常重要。無論您實際使用哪個過濾器,順序都應如下:
1.?ChannelProcessingFilter
,因為它可能需要重定向到不同的協(xié)議
2.?SecurityContextPersistenceFilter
,因此可以在 Web 請求開始時在 SecurityContextHolder 中設置 SecurityContext,并且對 SecurityContext 的任何更改都可以在HttpSession
Web 請求結束時復制到(準備用于下一個 Web 請求)
3.?ConcurrentSessionFilter
,因為它使用該SecurityContextHolder
功能,但需要更新SessionRegistry
以反映來自主體的正在進行的請求
4.身份驗證處理機制-?UsernamePasswordAuthenticationFilter
、CasAuthenticationFilter、BasicAuthenticationFilter 等 - 以便可以修改 SecurityContextHolder 以包含有效的身份驗證請求令牌
5.?,SecurityContextHolderAwareRequestFilter
如果您使用它來將 Spring Security 感知安裝HttpServletRequestWrapper
到您的 servlet 容器中
6.?RememberMeAuthenticationFilter
,以便如果沒有早期身份驗證處理機制更新了SecurityContextHolder
,并且請求提供了一個 cookie,使記住我服務能夠發(fā)生,一個合適的記住的 Authentication 對象將被放置在那里
7.?AnonymousAuthenticationFilter
,這樣,如果沒有早期的身份驗證處理機制更新SecurityContextHolder
,一個匿名的 Authentication 對象將被放置
8.捕獲ExceptionTranslationFilter
任何 Spring Security 異常,以便返回 HTTP 錯誤響應或AuthenticationEntryPoint
啟動適當?shù)捻憫?br />9.FilterSecurityInterceptor
保護 Web URI 并在訪問被拒絕時引發(fā)異常
只是為了提供一些 Spring Security 中過濾器的想法

TA貢獻1829條經驗 獲得超9個贊
你必須寫你的 userDetial 來告訴 spring 當前的用戶授權和配置
public class MyUserDetails implements UserDetails {
/**
*
*/
private static final long serialVersionUID = 1L;
private User user;
public MyUserDetails(User user) {
this.user = user;
}
@Override
public String getUsername() {
return user.getLogin();
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getGrantedAuthorities();
}
@Override
public boolean isAccountNonExpired() {
return user.getActivated();
}
@Override
public boolean isAccountNonLocked() {
return user.getActivated();
}
@Override
public boolean isCredentialsNonExpired() {
return user.getActivated();
}
@Override
public boolean isEnabled() {
return user.getActivated();
}
}
你的過濾器可能是這樣的
public class JWTFilter extends GenericFilterBean {
private TokenProvider tokenProvider;
public JWTFilter(TokenProvider tokenProvider) {
this.tokenProvider = tokenProvider;
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String jwt = resolveToken(httpServletRequest);
if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
Authentication authentication = this.tokenProvider.getAuthentication(jwt);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
filterChain.doFilter(servletRequest, servletResponse);
}
private String resolveToken(HttpServletRequest request){
String bearerToken1 = RequestUtil.getTokenFromHeader(request);
if (bearerToken1 != null) return bearerToken1;
String jwt = request.getParameter(JWTConfigurer.AUTHORIZATION_TOKEN);
if (StringUtils.hasText(jwt)) {
return jwt;
}
return null;
}
}
你必須將你的 userDetailService 更改為 spring 知道如何laod你的用戶
@Component("userDetailsService")
public class DomainUserDetailsService implements UserDetailsService {
private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class);
private final UserRepository userRepository;
public DomainUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional
public UserDetails loadUserByUsername(final String login) {
log.debug("Authenticating {}", login);
String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
Optional<User> userByLoginFromDatabase = userRepository.findOneWithRolesByLogin(lowercaseLogin);
return userByLoginFromDatabase.map(user -> new MyUserDetails(user))
.orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database"));
}
}
添加回答
舉報