#
# 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.
#
# ============================================================================
# Failsafe properties-based Realm configuration
#
# A Properties-based configuration is static by nature, which means its user,
# role, and permission definitions contained within do not change during
# runtime.  This means you can't add or remove any of them during runtime
# which is probably of little value to a 'real' application.
#
# This file primarily exists as a failsafe mechanism in case you don't provide
# any Realms to the Ki SecurityManager at startup.  It also serves as a
# simple and fun example.  But you will want to provide one or more of your
# own Realms in a real application.
#
# The key/value pairs format is defined in the
# org.apache.ki.realm.text.PropertiesRealm JavaDoc, but it is probably simple
# enough that you could figure it out from looking at the definitions below.
#
# For those that might not understand the references in this file, the
# definitions are all based on the classic Mel Brooks' film "Spaceballs". ;)
# ============================================================================

# ------------------------------
# Users and their assigned roles
# ------------------------------
# user 'root' with password 'secret' and the 'root' role
user.root = secret,root
# user 'guest' with the password 'guest' and the 'guest' role
user.guest = guest,guest
# user 'presidentskroob' with password '12345' ("That's the same combination on my luggage!!!" ;)), and role 'president'
user.presidentskroob = 12345,president
# user 'darkhelmet' with password 'ludicrousspeed' and roles 'darklord' and 'schwartz'
user.darkhelmet = ludicrousspeed,darklord,schwartz
# user 'lonestarr' with password 'vespa' and roles 'goodguy' and 'schwartz'
user.lonestarr = vespa,goodguy,schwartz

# -------------------------------
# Roles with assigned permissions
# -------------------------------
# 'root' role has all permissions, indicated by the wildcard '*'
role.root = *
# The 'schwartz' role can do anything (*) with any lightsaber:
role.schwartz = lightsaber:*
# The 'goodguy' role is allowed to 'drive' (action) the winnebago (type) with license plate 'eagle5' (instance specific id)
role.goodguy = winnebago:drive:eagle5
