Oauth2 – JDBC-Implementierung so ändern Sie die Namen von Datenbanktabellen

Habe ich umgesetzt OAuth2 mit Spring security folgende diesem link. Jetzt gibt es mehrere Tabellen mit folgenden Namen oauth_client_details , oauth_code , oauth_client_token und etc. Nun, was ich tun müssen, ist zu ändern Sie diesen Namen. mit einem Präfix (wie „security_“). Wie kann ich das tun ?



4 Replies
  1. 2

    1) JdbcClientDetailsService implementiert ClientDetailsService verwendet oauth_client_details Tabelle in hart-codiert JDBC PreparedStatements.

    2) JdbcClientTokenServices implementiert ClientTokenServices verwendet oauth_client_token Tabelle in hart-codiert JDBC PreparedStatements.

    3) JdbcAuthorizationCodeServices implementiert AuthorizationCodeServices verwendet oauth_code Tabelle in hart-codiert JDBC PreparedStatements.

    In Ihrem Oauth2Config.java oder SecurityConfig (was auch immer Sie es nennen), wenn Sie Draht bis Ihre Dienste, Sie könnte verwenden Sie einen benutzerdefinierten Dienst, dass Sie die hand eingeklemmt, die implementiert die gleiche Schnittstelle wie der Service, den Sie versuchen, zu überschreiben.

    So… Wenn Sie wollte, um zu speichern Sie Ihre Client-Token in einer Tabelle namens security_oauth_tokens, dann könnten Sie einfach implementieren, Ihre eigenen ClientTokenServices und verdrahten Sie es in Ihrer Konfiguration statt.

    Hier ist ein grobes Beispiel, wie Sie beginnen könnte erstellen eine CustomClientTokenServices verwendet, Frühling Repositories:

    @Component
    public class RepositoryClientTokenServices implements ClientTokenServices
    {
    
        @Autowired
        TokenRepository repository;
    
        private ClientKeyGenerator keyGenerator = new DefaultClientKeyGenerator();
    
        @Override
        public OAuth2AccessToken getAccessToken(final OAuth2ProtectedResourceDetails resource, final Authentication authentication)
        {
    
            String accessToken = keyGenerator.extractKey(resource, authentication);
            TokenEntity tokenEntity = this.repository.findByAuthenticationId(accessToken);
    
            if (tokenEntity == null && LOG.isInfoEnabled())
            {
                LOG.debug("Failed to find access token for authentication " + authentication);
                return null;
            }
    
            return new DefaultOAuth2AccessToken(tokenEntity.getValue());
        }
    
        @Override
        public void saveAccessToken(final OAuth2ProtectedResourceDetails resource, final Authentication authentication, final OAuth2AccessToken accessToken)
        {
          //use the repository to save the token
        }
    
        @Override
        public void removeAccessToken(final OAuth2ProtectedResourceDetails resource, final Authentication authentication)
        {
          //use repository to remove the token
        }
    }

    Aber! Wahrscheinlich der einfachste Weg wäre eine CustomJDBCClientTokenServices, das macht einfach ein suchen/ersetzen auf dem der name der Tabelle wie diese:

    @Component
    public class CustomJdbcClientTokenServices implements ClientTokenServices {
    
        private static final Log LOG = LogFactory.getLog(JdbcClientTokenServices.class);
    
        private static final String DEFAULT_ACCESS_TOKEN_INSERT_STATEMENT = "insert into security_oauth_client_token (token_id, token, authentication_id, user_name, client_id) values (?, ?, ?, ?, ?)";
    
        private static final String DEFAULT_ACCESS_TOKEN_FROM_AUTHENTICATION_SELECT_STATEMENT = "select token_id, token from security_oauth_client_token where authentication_id = ?";
    
        private static final String DEFAULT_ACCESS_TOKEN_DELETE_STATEMENT = "delete from security_oauth_client_token where authentication_id = ?";
    
        private String insertAccessTokenSql = DEFAULT_ACCESS_TOKEN_INSERT_STATEMENT;
    
        private String selectAccessTokenSql = DEFAULT_ACCESS_TOKEN_FROM_AUTHENTICATION_SELECT_STATEMENT;
    
        private String deleteAccessTokenSql = DEFAULT_ACCESS_TOKEN_DELETE_STATEMENT;
    
        private ClientKeyGenerator keyGenerator = new DefaultClientKeyGenerator();
    
        private final JdbcTemplate jdbcTemplate;
    
        public CustomJdbcClientTokenServices(DataSource dataSource) {
            Assert.notNull(dataSource, "DataSource required");
            this.jdbcTemplate = new JdbcTemplate(dataSource);
        }
    
        public void setClientKeyGenerator(ClientKeyGenerator keyGenerator) {
            this.keyGenerator = keyGenerator;
        }
    
        public OAuth2AccessToken getAccessToken(OAuth2ProtectedResourceDetails resource, Authentication authentication) {
    
            OAuth2AccessToken accessToken = null;
    
            try {
                accessToken = jdbcTemplate.queryForObject(selectAccessTokenSql, new RowMapper<OAuth2AccessToken>() {
                    public OAuth2AccessToken mapRow(ResultSet rs, int rowNum) throws SQLException {
                        return SerializationUtils.deserialize(rs.getBytes(2));
                    }
                }, keyGenerator.extractKey(resource, authentication));
            }
            catch (EmptyResultDataAccessException e) {
                if (LOG.isInfoEnabled()) {
                    LOG.debug("Failed to find access token for authentication " + authentication);
                }
            }
    
            return accessToken;
        }
    
        public void saveAccessToken(OAuth2ProtectedResourceDetails resource, Authentication authentication,
                                    OAuth2AccessToken accessToken) {
            removeAccessToken(resource, authentication);
            String name = authentication==null ? null : authentication.getName();
            jdbcTemplate.update(
                    insertAccessTokenSql,
                    new Object[] { accessToken.getValue(), new SqlLobValue(SerializationUtils.serialize(accessToken)),
                            keyGenerator.extractKey(resource, authentication), name,
                            resource.getClientId() }, new int[] { Types.VARCHAR, Types.BLOB, Types.VARCHAR, Types.VARCHAR,
                            Types.VARCHAR });
        }
    
        public void removeAccessToken(OAuth2ProtectedResourceDetails resource, Authentication authentication) {
            jdbcTemplate.update(deleteAccessTokenSql, keyGenerator.extractKey(resource, authentication));
        }
    
        public void setInsertAccessTokenSql(String insertAccessTokenSql) {
            this.insertAccessTokenSql = insertAccessTokenSql;
        }
    
        public void setSelectAccessTokenSql(String selectAccessTokenSql) {
            this.selectAccessTokenSql = selectAccessTokenSql;
        }
    
        public void setDeleteAccessTokenSql(String deleteAccessTokenSql) {
            this.deleteAccessTokenSql = deleteAccessTokenSql;
        }
    
    }
  2. 0

    Weil dieser Namen sind hart-codiert im inneren client – &provider-Klassen:

    "oauth_client_details" im org.springframework.security.oauth2.provider.client.JdbcClientDetailsService,

    "oauth_code" im org.springframework.security.oauth2.provider.code.JdbcAuthorizationCodeServices

    "oauth_client_token" im org.springframework.security.oauth2.client.token.JdbcClientTokenServices

    und so weiter,

    wahrscheinlich musst du manuell umschreiben jene Klassen und binden Sie diese an Ihre eigenen client – &provider-Klassen.

    (Dies sieht nicht einfach aber).

  3. 0

    Beim erstellen der JDBCTokenStore in diesem fragment:

    @Bean
    public TokenStore tokenStore() {
        return new JdbcTokenStore(dataSource());
    }

    Können Sie unterschiedliche Werte für die SQL-Abfragen, die JDBCTokenStore hat Problem mit der Datenbank, bevor Rücksendung der Sache widerrufen. Werfen Sie einen Blick auf die source code: Sie werden sehen, verschiedene setter, alle Abfragen verwendet.

  4. 0

    Es ist so einfach.
    Gehen Sie folgendermaßen vor:

    1. finden JdbcClientDetailsService und JdbcTokenStore von oauth2 jar-Datei oder Benutzer, die auf diese Klassen in spring-security.xml config-Datei.
    <bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.store.JdbcTokenStor*">
         <constructor-arg ref="dataSource" />
    </bean>
    1. eine Kopie von jeder Klasse und erstellen Sie eine neue in Ihrem Programm. ändern Sie dann den Namen der Tabellen und Spalten zu Ihren entsprechenden Namen (ich ändere die Tabellen-und Spaltennamen).
    public class CustomeJdbcTokenStore implements TokenStore { 
        private String insertAccessTokenSql = "insert oauthAccessToken
            (tokenId, token, authenticationId, username, clientId, authentication, refreshToken) 
            values (?, ?, ?, ?, ?, ?, ?)";
    
        private String selectAccessTokenSql = "select tokenId, token from 
             oauthAccessToken where tokenId = ?";
    
        private String selectAccessTokenAuthenticationSql = "select tokenId, authentication from 
             oauthAccessToken where tokenId = ?";
    1. Hinzufügen neue Klasse zu spring-security.xml Datei.
    <bean id="tokenStore" class="ir.hossein.irtms.service.CustomJdbcTokenStore**">
         <constructor-arg ref="dataSource" />
    </bean>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.