第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Spring Security 中的身份驗證和授權有什么區(qū)別?

Spring Security 中的身份驗證和授權有什么區(qū)別?

Qyouu 2023-10-19 15:03:24
我正在開發(fā)一個 java spring boot 項目,我正在嘗試使用 JWT 設置 spring security 以進行用戶身份驗證,我正在關注的教程(以及我在互聯(lián)網上找到的許多教程和項目)討論了兩個部分-認證和授權。在大多數(shù)教程中,有兩個過濾器類,一個處理身份驗證,另一個處理授權?。ㄎ野l(fā)現(xiàn)有些只有一個擴展OncePerRequestFilter類的類)。在那些具有兩個過濾器類的項目中,身份驗證過濾器類擴展了UsernamePasswordAuthenticationFilter類。授權類擴展BasicAuthenticationFilter類。有沒有一種方法,我只能在我的項目中使用身份驗證部分,或者我應該使用這兩個類在 Spring Security 中設置用戶身份驗證?任何解釋將不勝感激。
查看完整描述

2 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

有沒有一種方法,我只能在我的項目中使用身份驗證部分,或者我應該使用這兩個類在 Spring Security 中設置用戶身份驗證?

不,不存在只有身份驗證部分的概念,您對 Spring Security 的看法是錯誤的,Spring Security 的全部內容都與使用默認配置或實現(xiàn)自定義配置有關。(AuthenticationFilters、、AuthenticationProvidersAuthenticationToken



Spring security 是關于身份驗證和授權的,Spring security 是通過在 web.xml 中聲明一個過濾器 DelegatingFilterProxy 來配置的(在 Spring boot 中,它將通過自動配置來完成)。


Spring 安全性在代理過濾器或 Spring 托管 bean 方面將WALL?(?HttpFireWall?)放置在您的應用程序之前。如果請求在身份驗證和授權部分都成功,則可以到達您的應用程序。

1. 身份驗證就是對用戶的身份識別。

它將經歷

  • 驗證憑證或

  • 驗證授權標頭內容或

  • 驗證與請求關聯(lián)的 cookie(JSESSIONID cookie),即會話

  • 如果以上都不匹配,則用戶被識別為匿名。

在此步驟中將Authentication?創(chuàng)建對象。從 auth 對象你可以得到

  • 詳細信息對象(有關身份驗證請求的其他詳細信息)

  • 主要對象UserDetailsAuthenticatedPrincipalPrincipal

  • 憑據(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 的任何更改都可以在HttpSessionWeb 請求結束時復制到(準備用于下一個 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 中過濾器的想法

https://img1.sycdn.imooc.com/6530faf70001a5ee06420695.jpg

查看完整回答
反對 回復 2023-10-19
?
PIPIONE

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"));


}


}


查看完整回答
反對 回復 2023-10-19
  • 2 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號