cas4.2源碼分析_cas ticket生成方式

研究好幾天cas了把幾個重要的過程記錄一下
login-webflow.xml是cas登陸的重要入口

<action-state id="realSubmit">
        <evaluate
                expression="authenticationViaFormAction.submit(flowRequestContext, flowScope.credential, messageContext)"/>
        <transition on="warn" to="warn"/>
       
        <transition on="success" to="sendTicketGrantingTicket"/>
        <transition on="successWithWarnings" to="showMessages"/>
        <transition on="authenticationFailure" to="handleAuthenticationFailure"/>
        <transition on="error" to="initializeLogin"/>
    </action-state>

登錄入口 AuthenticationViaFormAction

public final Event submit(final RequestContext context, final Credential credential,
                              final MessageContext messageContext)  {
        if (isRequestAskingForServiceTicket(context)) {
            return grantServiceTicket(context, credential);
        }

        return createTicketGrantingTicket(context, credential, messageContext);
    }

往下走

@Audit(
        action = "TICKET_GRANTING_TICKET",
        actionResolverName = "CREATE_TICKET_GRANTING_TICKET_RESOLVER",
        resourceResolverName = "CREATE_TICKET_GRANTING_TICKET_RESOURCE_RESOLVER"
    )
    @Timed(
        name = "CREATE_TICKET_GRANTING_TICKET_TIMER"
    )
    @Metered(
        name = "CREATE_TICKET_GRANTING_TICKET_METER"
    )
    @Counted(
        name = "CREATE_TICKET_GRANTING_TICKET_COUNTER",
        monotonic = true
    )
public TicketGrantingTicket
createTicketGrantingTicket(AuthenticationContext context) throws AuthenticationException, AbstractTicketException {
        Authentication authentication = context.getAuthentication();
        TicketGrantingTicketFactory factory = (TicketGrantingTicketFactory)this.ticketFactory.get(TicketGrantingTicket.class);
        TicketGrantingTicket ticketGrantingTicket = factory.create(authentication);
        this.ticketRegistry.addTicket(ticketGrantingTicket);
        this.doPublishEvent(new CasTicketGrantingTicketCreatedEvent(this, ticketGrantingTicket));
        return ticketGrantingTicket;
    }

調用票據工廠的create方法

 @NotNull
    @Resource(name="grantingTicketExpirationPolicy")
    protected ExpirationPolicy ticketGrantingTicketExpirationPolicy;

    @Override
    public <T extends TicketGrantingTicket> T create(final Authentication authentication) {
        final TicketGrantingTicket ticketGrantingTicket = new TicketGrantingTicketImpl(
                this.ticketGrantingTicketUniqueTicketIdGenerator.getNewTicketId(TicketGrantingTicket.PREFIX),
                authentication, ticketGrantingTicketExpirationPolicy);
        return (T) ticketGrantingTicket;
    }

生成票據的最終位置----> DefaultUniqueTicketIdGenerator 中的getNextNumberAsString方法

public final String getNewTicketId(final String prefix) {
        final String number = this.numericGenerator.getNextNumberAsString();
        final StringBuilder buffer = new StringBuilder(prefix.length() + 2
                + (StringUtils.isNotBlank(this.suffix) ? this.suffix.length() : 0) + this.randomStringGenerator.getMaxLength()
                + number.length());
        buffer.append(prefix);
        buffer.append('-');
        buffer.append(number);
        buffer.append('-');
        buffer.append(this.randomStringGenerator.getNewString());

        if (this.suffix != null) {
            buffer.append(this.suffix);
        }

        return buffer.toString();
    }

第一次寫筆記有什麼缺點請見諒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章