spring sso自定义授权页面

简介

用户

授权客户端

  • 客户端的配置与用户配置极为类似,代码如下。

实体类


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Client implements ClientDetails {

    @Id
    @GeneratedValue
    private Long id;
    private String clientId;
    private String secret;
    private String scopes; // 以逗号分隔
    private String grantTypes; // 以逗号分隔
    private String redirectUris; // 以逗号分隔

    @Override
    public Set<String> getResourceIds() {
        return null;
    }

    @Override
    public boolean isSecretRequired() {
        return true;
    }

    @Override
    public String getClientSecret() {
        return getSecret();
    }

    @Override
    public boolean isScoped() {
        return true;
    }

    @Override
    public Set<String> getScope() {
        return stringToSet(getScopes());
    }

    @Override
    public Set<String> getAuthorizedGrantTypes() {
        return stringToSet(getGrantTypes());
    }

    @Override
    public Set<String> getRegisteredRedirectUri() {
        return stringToSet(getRedirectUris());
    }

    @Override
    public Collection<GrantedAuthority> getAuthorities() {
        return new ArrayList<>();
    }

    @Override
    public Integer getAccessTokenValiditySeconds() {
        return null;
    }

    @Override
    public Integer getRefreshTokenValiditySeconds() {
        return null;
    }

    @Override
    public boolean isAutoApprove(String scope) {
        return false;
    }

    @Override
    public Map<String, Object> getAdditionalInformation() {
        return null;
    }

    private Set<String> stringToSet(String items){
        Set<String> set = new HashSet<>();
        if(!StringUtils.isEmpty(items)){
            for (String item : items.split(",")) {
                set.add(item);
            }
        }
        return set;
    }
}

配置类

  • 新增 ClientRepository
public interface ClientRepository extends JpaRepository<Client, Long> {
    Client findByClientId(String clientId);
}
  • 新增JpaClientDetailsService
public class JpaClientDetailsService implements ClientDetailsService {

    @Autowired
    private ClientRepository clientRepository;

    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
        return clientRepository.findByClientId(clientId);
    }
}
  • AuthorizationConfig需要修改configure(ClientDetailsServiceConfigurer clients)方法的实现:
@Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(jpaClientDetailsService());
    }
    
    @Bean
    public JpaClientDetailsService jpaClientDetailsService(){
        return new JpaClientDetailsService();
    }

自定义授权页面

  • 预制的授权页面较为丑陋,且是英文,无法满足实际需求,因此我们需要自定义授权页面,自定义较为简单,只需要定义/oauth/confirm_access接口,转向自定义页面即可。

引入Thymeleaf及js相关依赖

<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>bootstrap</artifactId>
	<version>4.1.3</version>
</dependency>
<dependency>
	<groupId>org.webjars</groupId>
	<artifactId>jquery</artifactId>
	<version>3.3.1</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

接口

@Controller
@RequestMapping("/oauth")
@SessionAttributes("authorizationRequest")
public class OauthController {

    /**
     * 自定义授权页面
     * @return
     */
    @RequestMapping("/confirm_access")
    public String oauthConfirmPage(Model model){
        return "approval.html";
    }
}

页面

  • resources/templates文件夹下新增approval.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>授权页面</title>
    <script src="/auth/webjars/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    <script src="/auth/webjars/jquery/3.3.1/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="/webjars/bootstrap/4.1.3/css/bootstrap.min.css">
</head>
<body>
    是否同意授权<b th:text="${authorizationRequest.clientId}"></b>?:
    <form action="/auth/oauth/authorize" method="post" id="form">
        <input type="hidden" name="user_oauth_approval" value="true"/>
        <input type="hidden" name="authorize" value="Authorize"/>
        <div id="div"></div>
        <input type="submit">
    </form>


</body>
<script th:inline="javascript">
    var authorizationRequest = [[${authorizationRequest}]];
    console.log(authorizationRequest);

    var div = document.getElementById('div');
    var scopes = authorizationRequest.scope;
    for (var i = 0; i < scopes.length; i++) {
        div.innerHTML += scopes[i] + ":" + "同意:<input type='radio' name='scope."+scopes[i]+"' value='true'>" + "拒绝:<input type='radio' name='scope."+scopes[i]+"' value='false' checked><br>";
    }
</script>
</html>

源码地址:github

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值