# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
AbstractAccessDecisionManager.accessDenied=Acesso negado
AbstractSecurityInterceptor.authenticationNotFound=Um objeto de autentica\u00E7\u00E3o n\u00E3o foi encontrado no SecurityContext
AbstractUserDetailsAuthenticationProvider.badCredentials=Usu\u00E1rio inexistente ou senha inv\u00E1lida
AbstractUserDetailsAuthenticationProvider.credentialsExpired=Credenciais expiradas
AbstractUserDetailsAuthenticationProvider.disabled=Usu\u00E1rio desabilitado
AbstractUserDetailsAuthenticationProvider.expired=Conta expirada
AbstractUserDetailsAuthenticationProvider.locked=Conta bloqueada
AbstractUserDetailsAuthenticationProvider.onlySupports=Somente UsernamePasswordAuthenticationToken \u00E9 suportado
AccountStatusUserDetailsChecker.credentialsExpired=Credenciais expiradas
AccountStatusUserDetailsChecker.disabled=Usu\u00E1rio desabilitado
AccountStatusUserDetailsChecker.expired=Conta expirada
AccountStatusUserDetailsChecker.locked=Conta bloqueada