我必须为需要进行身份验证的组织设计一个应用程序,并使用Spring Boot在Azure目录中使用SSO。
所有员工信息都存储在AD中。我的自定义应用程序将拥有自己的用户及其角色,并将其保存在数据库中。并非组织中的每个员工都可以访问此应用程序。管理员将在数据库(Mysql)中添加用户及其角色。
通过在属性文件中添加相关详细信息并配置WebSecurify Config类,我可以弄清楚使用AD执行SSO
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;
@Autowired
private AADAuthenticationFilter aadAuthFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests().antMatchers(HttpMethod.OPTIONS,
"/**").permitAll().anyRequest().authenticated()
.and()
.oauth2Login()
.userInfoEndpoint()
.oidcUserService(oidcUserService);
http
.addFilterBefore(aadAuthFilter, UsernamePasswordAuthenticationFilter.class);
http
.headers()
.frameOptions().sameOrigin()
.cacheControl();
http
.csrf().disable()
.authorizeRequests().antMatchers(HttpMethod.OPTIONS,
"/**").permitAll().anyRequest().authenticated()
}
}
用户通过验证后,作为响应,我将获得JWT令牌,该令牌将用于所有其他API请求。但是问题是,由于他使用AD进行身份验证,因此我在这里允许所有员工访问该应用程序。但是,一旦用户通过身份验证,我想检查该用户在数据库中是否可用,如果该用户不可用,我需要发送无效的用户,如果他是我的应用程序的有效用户,则需要获取角色并将其发送到前端作为有效响应。
我还想为用户提供服务级别授权,我对大多数服务都使用了@PreAuthorize Annotation。 @PreAuthorize(“ hasRole('ROLE_VIEWER')或hasRole('ROLE_EDITOR')”)
答案 0 :(得分:0)
根据我的理解,您不需要使用Mysql数据库来存储用户及其角色,我们可以仅通过Azure Active Directory来实现此要求。
首先,我们可以通过单击azure门户上的“组”->“新建组”按钮并在azure广告中的员工中选择要加入该组的成员,以在Azure Active Directory中创建一个组(显示为下面的屏幕截图):
然后通过单击“应用程序注册”并单击“清单”按钮转到天蓝色广告中的应用程序。
您还可以在上面的屏幕截图的“ appRoles”属性下添加更多角色。
然后,在您的Azure广告应用程序中,单击“本地目录中的托管应用程序”。
现在,您可以通过在问题中提到的注释(@PreAuthorize)为用户执行服务级别授权,也可以参考此tutorial。
顺便说一句,如果我们想为天蓝色广告中的组分配角色,我们需要为天蓝色广告(Azure Active Directory pricing)制定Premium P1或P2计划。如果您没有高级计划,则可以为每个用户分配一个角色,但不能为最后一个屏幕截图中的组分配角色。